2.17. Wskazówki typów

Python pozwala adnotować parametry funkcji i wartości zwracane informacją o typie. Adnotacje są ignorowane w czasie wykonania – nic ich nie sprawdza, nic nie konwertuje na ich podstawie – ale służą jako dokumentacja dla czytających oraz dla IDE.

2.17.1. Składnia adnotacji

Adnotacja parametru znajduje się po dwukropku. Typ zwracany znajduje się po -> i przed dwukropkiem ciała:

def greet(name: str) -> None:
    print("hello,", name)

def add(a: int, b: int) -> int:
    return a + b

def average(values: list) -> float:
    return sum(values) / len(values)

Wskazówki opisują, co powinno zostać przekazane i co zostanie zwrócone. Wywołanie add("hi", "there") nie zgłasza błędu – Python i tak uruchamia ciało. Wskazówki są kontraktem, a nie kontrolą.

Parametr może mieć zarówno wartość domyślną, jak i adnotację:

def greet(name: str, greeting: str = "hello") -> None:
    print(greeting, name)

CPython ma bogatszą notację (Optional, Union, typy generyczne) poprzez moduł typing, ale są one ciężkie na MicroPython i rzadko potrzebne w codziennym kodzie kamery.

2.17.2. MicroPython w czasie wykonania

MicroPython parsuje adnotacje, a następnie je ignoruje. Na kamerze nie ma modułu typing do zaimportowania; próba użycia Optional[int] lub list[int] albo nie powiedzie się przy imporcie, albo po cichu zachowa się jak zwykły dostęp do atrybutu, w zależności od kompilacji oprogramowania układowego.

W adnotacjach trzymaj się zwykłych nazw typów (int, float, str, bool, bytes, list, tuple, dict). Nic nie kosztują w czasie wykonania i jasno przekazują intencję.

2.17.3. Jak używa ich IDE

IDE odczytuje adnotacje, aby zasilać dymki, autouzupełnianie i wskazówki w linii. Funkcja z adnotacją -> int pokazuje int jako swój typ zwracany, gdy kursor najedzie na wywołanie. Parametr z adnotacją : str autouzupełnia metody łańcuchowe na argumencie wewnątrz ciała funkcji.

To praktyczna korzyść z pisania adnotacji w środowisku uruchomieniowym, które je ignoruje: lepsze wsparcie ze strony edytora bez żadnego kosztu, gdy skrypt działa na kamerze.

2.17.4. Adnotacje zmiennych

Adnotacje na zwykłych przypisaniach działają w ten sam sposób:

threshold: float = 0.5
name: str = "OpenMV"

Te również są ignorowane w czasie wykonania. Ich głównym zastosowaniem jest uwidocznienie zamierzonego typu, gdy prawa strona go nie ukazuje – zwykle wtedy, gdy wartość początkowa jest symbolem zastępczym, który zostanie później zastąpiony.