2.17. Подсказки типов

Python позволяет аннотировать параметры функции и возвращаемые значения информацией о типах. Аннотации игнорируются во время выполнения – ничто их не проверяет, ничто не выполняет преобразований на их основе – но они служат документацией для читателей и для IDE.

2.17.1. Синтаксис аннотаций

Аннотация параметра указывается после двоеточия. Возвращаемый тип указывается после -> и перед двоеточием тела:

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)

Подсказки описывают, что должно быть передано и что будет возвращено. Вызов add("hi", "there") не вызывает ошибки – Python всё равно выполняет тело. Подсказки – это контракт, а не проверка.

Параметр может иметь как значение по умолчанию, так и аннотацию:

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

В CPython есть более богатая нотация (Optional, Union, обобщённые типы) через модуль typing, но они тяжеловесны для MicroPython и редко нужны для повседневного кода камеры.

2.17.2. MicroPython во время выполнения

MicroPython разбирает аннотации, а затем игнорирует их. На камере нет модуля typing, который можно было бы импортировать; попытка использовать Optional[int] или list[int] либо не сможет выполнить импорт, либо незаметно поведёт себя как обычный доступ к атрибуту, в зависимости от сборки прошивки.

Придерживайтесь в аннотациях простых имён типов (int, float, str, bool, bytes, list, tuple, dict). Они ничего не стоят во время выполнения и ясно передают намерение.

2.17.3. Как их использует IDE

IDE читает аннотации, чтобы формировать всплывающие подсказки, автодополнение и встроенные подсказки. Функция, аннотированная как -> int, показывает int в качестве возвращаемого типа при наведении курсора на вызов. Параметр, аннотированный как : str, автодополняет строковые методы для аргумента внутри тела функции.

В этом практическая выгода написания аннотаций на среде выполнения, которая их игнорирует: лучшая поддержка со стороны редактора без каких-либо затрат при выполнении скрипта на камере.

2.17.4. Аннотации переменных

Аннотации обычных присваиваний работают так же:

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

Они тоже игнорируются во время выполнения. Их основное применение – сделать предполагаемый тип очевидным, когда правая часть не делает его очевидным – обычно когда начальное значение является заглушкой, которая будет заменена позже.