Standardy w Projektach Python

Wprowadzenie do narzędzi `uv`, `ruff` i `ty`

Posted by wojtek on May 26, 2025 in Development · 5 mins read

Wstęp

Python to wyjątkowy język programowania, a jego nazwa nawiązuje wprost do słynnego brytyjskiego kabaretu:

When he began implementing Python, Guido van Rossum was also reading the published scripts from Monty Python’s Flying Circus, a BBC comedy series from the 1970s. Van Rossum thought he needed a name that was short, unique, and slightly mysterious, so he decided to call the language Python. źródło

Paradoksalnie — cechy będące zaletami języka potrafią jednocześnie stać się jego wadami. Python cieszy się gigantyczną popularnością: od prostych skryptów automatyzujących, przez aplikacje webowe, aż po projekty z zakresu uczenia maszynowego (ML) i sztucznej inteligencji (AI). Użytkownikami są zarówno doświadczeni architekci oprogramowania, jak i naukowcy skupieni bardziej na modelach niż na kodzie.

Dynamiczny rozwój ekosystemu powoduje jednak, że projekty powstają w oparciu o różne – często konkurencyjne – standardy i narzędzia. W sieci wciąż trafiamy na artykuły opisujące starsze podejścia, co z jednej strony zwiększa wybór, z drugiej utrudnia podjęcie decyzji „co jest teraz najlepsze”.

Gdy wiele lat temu pisałem jeszcze w PHP, wybór był prosty: Composer, PHPUnit i kilka sprawdzonych wzorców. W świecie Pythona wachlarz możliwości jest znacznie szerszy. Od pewnego czasu rozwijam szablon projektu wnowicki/pytemp, który aktualizuję, by korzystał z nowocześniejszych narzędzi. W tym artykule pokażę Ci, jak wygląda przyszłość zarządzania projektem w Pythonie z użyciem uv, Ruff i ty.

Uwaga: mam nadzieję, że liczba projektów „bez żadnego menedżera zależności” będzie systematycznie maleć. Jeśli nadal używasz samego pip, przygotuj się na migrację.

Narzędzia

uv

astral-sh/uv – ultraszybki menedżer pakietów

uv to „extremely fast Python package and project manager, written in Rust”. To jedyne narzędzie, które musimy zainstalować ręcznie:

curl -LsSf https://astral.sh/uv/install.sh | sh

Zawsze odwołuj się do oficjalnej dokumentacji – projekt rozwija się naprawdę szybko.

Nowy projekt uruchomisz jedną komendą:

uv init example

Dodawanie zależności:

uv add pandas

uv automatycznie zarządza wirtualnym środowiskiem, więc nie musisz go aktywować ani pamiętać o source venv/bin/activate. Skrypt uruchomisz po prostu:

uv run demo.py

Potrzebujesz eksportu zależności do requirements.txt (np. dla Jupytera)? Nie ma problemu – uv to obsługuje. Na tym etapie nie będziemy jednak zagłębiać się w szczegóły.

ruff

astral-sh/ruff – linter i formatter w jednym

Mając uv, instalacja Ruffa… nie wymaga instalacji. Wystarczy wywołać:

uvx ruff check     # linter
uvx ruff format    # formatter

(Alternatywne metody znajdziesz w dokumentacji.)

Konfiguracja

W pliku pyproject.toml ustawiasz preferencje, np.:

[tool.ruff.lint]
# Aktywuj reguły flake8-bugbear (B) oprócz domyślnych:
select = ["E4", "E7", "E9", "F", "B", "Q"]

# Nie wymuszaj limitu długości linii (E501):
ignore = ["E501"]
  • Formatter (ruff format) zmienia pliki w miejscu.
  • Linter (ruff check) domyślnie tylko raportuje, ale wiele problemów naprawisz automatycznie z opcją --fix:
uvx ruff check --fix

ty

astral-sh/ty – statyczna kontrola typów.

Lekkie skrypty bez adnotacji typów są wygodne, lecz w dużych aplikacjach ich brak mści się w najmniej spodziewanym momencie. Tu z pomocą przychodzi ty:

uvx ty check

Narzędzie analizuje kod i zwraca wszystkie niezgodności typów. Przykładowy komunikat:

error[invalid-parameter-default]: Default value of type `None` is not assignable to annotated parameter type `int`
   --> app/xxx/yyy.py:236:62
    |
235 |     def __container_url(
236 |         self, cont_id: int, only_not_assessed: bool = False, page: int = None
    |                                                              ^^^^^^^^^^^^^^^^
237 |     ) -> str:
238 |         url_params = {}
    |
info: rule `invalid-parameter-default` is enabled by default

Zabawa w usuwanie ostrzeżeń potrafi otworzyć oczy na błędy, które do tej pory umykały.

Podsumowanie

Powyżej opisałem trzy narzędzia, które – moim zdaniem – wyznaczają kierunek rozwoju projektów Pythonowych:

  1. uv – błyskawiczny menedżer pakietów i środowisk,
  2. Ruff – dwa w jednym: linter i formatter,
  3. ty – statyczna analiza typów.

W kolejnych wpisach przyjrzę się każdemu z nich bardziej szczegółowo. Jeśli masz pytania lub własne doświadczenia, podziel się nimi w komentarzach.