Standardy w Projektach Python
Wprowadzenie do narzędzi `uv`, `ruff` i `ty`
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:
- uv – błyskawiczny menedżer pakietów i środowisk,
- Ruff – dwa w jednym: linter i formatter,
- 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.
- Category:
- Development