Type hinting lub jak dawać wskazówki Pythonowemu interpretatorowi

Uwaga, wpis techniczny!

Kilka miesięcy temu została wypuszczona nowa wersja Pythona 3.9. Ponieważ dwa lata temu R przestał być językiem, w którym programuję ,,na co dzień" nowości Pythona mnie ciekawią i postanowiłem, że oprócz wykresów i analiz danych warto dzielić się także nieco bardziej technicznymi aspektami. To pierwsza odsłona nowej, technicznej twarzy Szychty :)

Co znajdziemy w nowej wersji Pythona? Zestawień nowości jest w internecie bardzo dużo, choćby tutaj. Chciałbym się skupić na tej, która najbardziej mnie zainteresowała czyli uproszczenie typowania funkcji. Jest to zmiana PEP 585 zaimplementowana notabene przez Polaka, Łukasza Langa i, również notabene, także z Poznania :) Możliwość określenie typów argumentów funkcji nie jest nowe, było już dostępne w wersji 3.6. Teraz jednak ten mechanizm jest znacznie prostszy do użycia ponieważ robimy to używając typów generycznych.

def greet_all(names: list[str]) -> None:
    for name in names:
        print("Hello", name)

Prosto, jasno i przyjemnie! W powyższy kodzie podawanie typu argumentu names nie jest konieczne. Jednak dzięki niemu, na etapie wykonywanie kodu, interpreter będzie wiedział, że names ma być listą ciągu znaków i nie przyjmie niczego innego.

O co w tym wszystkim chodzi? Nie wiem czy kojarzycie takie języki jak Haskell, Ocaml czy F#? Oprócz innych cech, łączy je statyczna kontrola typów. Zaletą takiego rozwiązania jest to, że kod jest bardziej stabilny, mniej jest błędów w czasie wykonywania kodu. Wadą jest potrzeba spędzenie nieraz długiego czasu, aby w większym projekcie wszystkie typy argumentów do siebie pasowały.

Python jest z kolei dynamicznie typowany, więc nie sprawdza typów przed wykonaniem programu. Można jednak obecnie łatwo wstawić ,,wskazówki" (typing hints), które pomagają interpretatorowi. W skrócie: sprawiają one, że program się wywala zamiast zwracać jakieś bezsensowne wyniki. Jednak nie jest to koniec korzyści z umieszczania ,,typing hints". Mimo że sam Python nie nakłada ograniczeń na typy, to środowiska programistyczne dają takie możliwości. Popularny PyCharm wspiera statyczne sprawdzenie typów, dzięki czemu część błędów można wychwycić już na etapie pisania kodu w edytorze. Bardzo ciekawą opcją jest także możliwość dodania statycznego sprawdzenie typów do tzw. ciągłej integracji (CI/CD). Można to zrobić wykorzystując bibliotekę mypy.

Jeśli chcielibyście przeczytać więcej na temat typów w Pythonie to bardzo gorąco polecam lekturę na stronie RealPython. Jest tam bardzo dokładnie opisane co Python robi, czemu to robi, a także jakie są ograniczenia i możliwości, które z tego wynikają.