Понимание аннотаций типов в Python

Понимание аннотаций типов в Python

@python_quiz

Разберем этот квиз

Условие (код из квиза)

python

Код выглядит так, будто переменная x должна содержать только целые числа. Давайте разберёмся, что здесь реально происходит и почему.

Что делает Python с аннотациями типов

  • Начиная с PEP 526 (Python 3.6) появилась возможность аннотировать переменные: x: List[int] = [].
  • Аннотации — это подсказки (type hints). Интерпретатор Python не будет автоматически проверять соответствие значения указанной аннотации.
  • Аннотации сохраняются в специальном словаре модуля __annotations__ и используются статическими инструментами (mypy, pyright), IDE и документацией.

Выполнение примера — результат

Если запустить код, он выполнится и напечатает список с строкой:

python

Ожидаемый вывод:

То есть добавление строки в список разрешено, ошибок во время выполнения не возникает.

Почему не возникает ошибки во время выполнения

  • Метод list.append не делает никаких проверок типов — он просто добавляет объект в список.
  • Аннотация List[int] не интерпретируется как правило исполнения; это лишь метаданные.
  • Если нужна статическая проверка, используются инструменты вроде mypy:

Пример использования mypy (команда в терминале):

bash

mypy выявит несоответствие между объявлением и фактическим типом добавленного значения.

Где можно получить проверку типов в рантайме

Если вам важно проверять типы во время выполнения, есть несколько подходов:

  1. Использовать библиотеку typeguard:
python
  1. Явно проверять значения с помощью isinstance:
python
  1. Использовать runtime-валидацию в моделях (pydantic, attrs с валидацией и т.п.).

Разбор возможных заблуждений (варианты из квиза)

  • "Код выполнится без ошибок, type hints не влияют на рантайм" — соответствует реальному поведению интерпретатора: аннотации не приводят к ошибке.
  • "Будет TypeError при выполнении append" — неверно для чистого Python: list.append не проверяет типы.
  • "Интерпретатор остановит программу из-за несоответствия аннотации" — неверно: интерпретатор не останавливает программу из-за аннотаций.
  • "Будет SyntaxError из-за неверной аннотации" — неверно: аннотация синтаксически корректна (в версиях Python, поддерживающих PEP 526).

Дополнительные замечания

  • Если используется from __future__ import annotations, аннотации хранятся в виде строк (отложённая оценка), но это никак не меняет отсутствие автоматической проверки типов.
  • Статический анализ и типизация помогают предотвращать ошибки и повышают читаемость кода, но для защит в рантайме нужно добавлять отдельную проверку.

Итог

Аннотации в Python — это мощный инструмент для документирования и статического анализа, но сами по себе они не навязывают правил во время исполнения. Чтобы получить проверку типов в рантайме, используйте сторонние библиотеки или явные проверки.

Report Page