Что такое аннотации типов и проверяются ли они при выполнении?
- Зачем нужны type hints в Python?
- Что такое mypy?
- Как указать, что значение может быть None?
Аннотации — подсказки о типах для людей и инструментов; интерпретатор их не проверяет.
- Проверяют статические анализаторы: mypy, pyright; IDE берут их для автодополнения
- Современная запись:
list[int](3.9+),int | None(3.10+)
А ещё Проверка во время выполнения — только явно: pydantic, свой isinstance
Подробно
Аннотации пишутся у параметров, возвращаемого значения и переменных: def greet(name: str) -> str. Python сохраняет их в __annotations__, но передать в функцию число вместо строки он не помешает — ошибка проявится только там, где код реально не сможет работать с числом.
Зачем они нужны:
- статическая проверка — mypy или pyright находят ошибки типов до запуска, в том числе в CI;
- IDE — точное автодополнение и навигация;
- документация — сигнатура говорит, что функция принимает и возвращает;
- библиотеки читают их во время выполнения: dataclasses, pydantic, FastAPI проверяют и преобразуют данные по аннотациям.
Основные конструкции:
- коллекции:
list[str],dict[str, int],tuple[int, ...]; - значение или None:
str | None(раньшеOptional[str]); - несколько типов:
int | str; - вызываемые объекты:
Callable[[int], str]; Any— отключить проверку для значения;Protocol— утиная типизация: «любой объект с методом read».
Пример
from dataclasses import dataclass
def find_user(user_id: int) -> "User | None":
...
@dataclass
class User:
id: int
name: str
tags: list[str]
def total(prices: dict[str, float]) -> float:
return sum(prices.values())
total({"кофе": 250.0}) # mypy: ок
total(["кофе"]) # mypy: ошибка ещё до запуска; Python упадёт только на .values()Что хотят услышать
- Аннотации не проверяются интерпретатором.
- Кто их использует: анализаторы, IDE, библиотеки.
- Базовый синтаксис коллекций и
X | None. - Знание mypy или pyright.
Частые ошибки
- «Если указать тип, Python не даст передать другой».
- Злоупотреблять
Any— проверка теряет смысл.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Интерпретатор проверяет аннотации при каждом вызове и бросает TypeError при несоответствии
- ✗Аннотации ускоряют выполнение кода: интерпретатор заранее знает типы переменных
- ✗Запись int | None в аннотациях доступна только начиная с Python 3.13
- ✓Подсказки для людей и инструментов; интерпретатор их не проверяет
Что спросят дальше
Разбор темы
- Аннотации типов, mypy и Pydantic
Что дают аннотации и кто их проверяет, как аннотировать коллекции, Optional и объединения, обобщённые типы, mypy в проекте, проверка данных Pydantic.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.