Historia pytania:
Dynamiczna typizacja charakteryzuje się w Pythonie od pierwszych wersji. Oznacza to, że zmienne nie są z góry przypisane do konkretnego typu danych, w przeciwieństwie do języków takich jak Java czy C++. Typ jest określany podczas wykonywania.
Problem:
Główną trudnością jest utrata wyraźnej kontroli nad typami. Utrudnia to wykrywanie błędów na etapie pisania kodu, co może prowadzić do logicznych błędów w czasie wykonania, szczególnie przy skalowaniu kodu.
Rozwiązanie:
Python rozwiązuje ten problem za pomocą duck typing (jeśli obiekt zachowuje się jak kaczka, to jest kaczką) oraz poprzez adnotacje typów (type hints), jednak adnotacje nie są obowiązkowe i nie są sprawdzane w czasie wykonywania, a jedynie przez narzędzia zewnętrzne.
Przykład kodu:
x = 42 # int x = "foo" # teraz to jest string def process(val): return val + val print(process(5)) # 10 print(process("ha")) # haha
Kluczowe cechy:
Czy można używać jednej zmiennej najpierw jako listy, a potem jako liczby w jednym bloku kodu, i czy doprowadzi to do błędu składniowego?
Tak — nie będzie błędu składniowego. Błąd wystąpi dopiero przy próbie wykonania nieprawidłowej operacji z nowym typem.
x = [1, 2, 3] x = 5 # print(x[0]) # błąd pojawi się tylko przy tym wywołaniu
Czy type hint w Pythonie gwarantuje, że zmienna zawsze będzie miała określony typ w czasie wykonywania?
Nie — type hint to tylko wskazówka, interpreter jej nie sprawdza. Typy mogą sprawdzać tylko lintery i mypy.
def foo(x: int) -> int: return x + 1 foo("string") # nie pojawi się błąd do momentu wywołania
Czy typ funkcji jest również dynamiczny? Czy można zmienić sygnaturę funkcji w czasie wykonywania?
Funkcja jest obiektem pierwszej klasy. Jej typ można nadpisać, ale sygnatury nie można zmienić (można zastąpić funkcję nową).
def f(): return 5 f = lambda: "abc" print(f()) # 'abc'
Negatywny przypadek
W jednym projekcie typy parametrów wejściowych funkcji nie były weryfikowane, co spowodowało, że dane z formularzy użytkowników przychodziły w postaci ciągów, a pracowano z nimi jak z liczbami. Pojawiały się nieprzewidywalne błędy na produkcji.
Plusy:
Szybkie prototypowanie, krótkie funkcje, mało boilerplate.
Minusy:
Trudno debugować, błędy pojawiają się w najbardziej nieoczekiwanych miejscach i tylko przy określonych danych.
Pozytywny przypadek
Przy użyciu type hints i statycznej walidacji typizacji za pomocą mypy problemy były wykrywane na etapie CI/CD przed wdrożeniem na produkcję.
Plusy:
Wczesne wykrywanie potencjalnych problemów, łatwość w utrzymywaniu kodu.
Minusy:
Poświęca się czas na dodatkową weryfikację, czasami dodaje się nieco zbędnego kodu.