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.