Какие библиотеки Python позволяют работать с типами
Что проверяют
Понимаете ли вы разницу между аннотациями, статической проверкой и проверкой во время выполнения. Главное, что хотят услышать: сам Python аннотации не проверяет. Следом спрашивают, чем mypy отличается от pydantic, или как типизировать обобщённую функцию.
Как отвечать
Разложите инструменты по назначению:
typing: стандартный модуль сProtocol,TypeVar,Literal,TypedDict,Callable. Для коллекций с Python 3.9 пишут встроенныеlist[int]иdict[str, int], алиасыListиDictустарели. С 3.10 объединение пишется какint | None, с 3.12 есть синтаксисdef first[T](xs: list[T]) -> T;typing_extensions: бэкпорт новых возможностейtypingна старые версии Python;- статические анализаторы:
mypyкак эталон иpyright(он же работает внутри Pylance в VS Code). Появились и быстрые проверяльщики на Rust, но они моложе. Ошибки находятся до запуска, в CI обычно включают--strict; pydantic: проверка и приведение данных во время выполнения по аннотациям. Вторая версия с ядром на Rust, это стандарт для FastAPI, конфигов, разбора JSON;dataclassesиattrs: генерация__init__,__repr__,__eq__по аннотированным полям. Типы при этом не проверяются,attrsумеет подключать валидаторы;beartypeиtypeguard: проверка аннотаций во время вызова функций, полезна в тестах.
Покажите, где что уместно: на границе системы, куда приходит внешний JSON, работает pydantic, внутри кода достаточно статической проверки.
Где спотыкаются
Думают, что аннотация age: int в @dataclass запретит передать строку. Не запретит: Python хранит аннотацию, но не проверяет её, это делает только mypy или pydantic.
Пишут from typing import List, Dict в новом коде. Это работает, но выдаёт незнание современных версий.
Путают Optional[int] с необязательным аргументом. Optional[int] означает «int или None», значение по умолчанию задаётся отдельно, и без него аргумент остаётся обязательным.