2.17. Typové anotace

Python vám umožňuje anotovat parametry funkce a návratové hodnoty informacemi o typu. Anotace jsou za běhu ignorovány – nic je nekontroluje, nic na jejich základě nepřevádí – ale slouží jako dokumentace pro čtenáře a pro IDE.

2.17.1. Syntaxe anotací

Anotace parametru jde za dvojtečku. Návratový typ jde za -> a před dvojtečku těla:

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)

Anotace popisují, co by mělo být předáno dovnitř a co bude vráceno. Volání add("hi", "there") nevyvolá chybu – Python tělo přesto spustí. Anotace jsou smlouva, nikoli kontrola.

Parametr může mít zároveň výchozí hodnotu i anotaci:

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

CPython má bohatší notaci (Optional, Union, generické typy) prostřednictvím modulu typing, ale ty jsou na MicroPythonu těžkopádné a pro běžný kód kamery zřídka potřebné.

2.17.2. MicroPython za běhu

MicroPython anotace parsuje a poté je ignoruje. Na kameře neexistuje žádný modul typing, který by se dal importovat; pokus o použití Optional[int] nebo list[int] se buď nepodaří naimportovat, nebo se tiše chová jako prostý přístup k atributu, podle konkrétního sestavení firmwaru.

V anotacích se držte prostých názvů typů (int, float, str, bool, bytes, list, tuple, dict). Za běhu nic nestojí a jasně vyjadřují záměr.

2.17.3. Jak je používá IDE

IDE čte anotace, aby řídilo nápovědy, automatické dokončování a inline tipy. Funkce anotovaná pomocí -> int zobrazí int jako svůj návratový typ, když kurzor najede na volání. Parametr anotovaný pomocí : str automaticky dokončuje řetězcové metody na argumentu uvnitř těla funkce.

To je praktický přínos psaní anotací na běhovém prostředí, které je ignoruje: lepší podpora ze strany editoru bez jakýchkoli nákladů, když skript běží na kameře.

2.17.4. Anotace proměnných

Anotace u prostých přiřazení fungují stejným způsobem:

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

I tyto jsou za běhu ignorovány. Jejich hlavním použitím je učinit zamýšlený typ zřejmým, když to pravá strana zřejmým nečiní – typicky když je počáteční hodnota zástupný symbol, který bude později nahrazen.