Как аннотировать списки, словари, необязательные значения и объединения типов?
- Как написать тип Optional?
- Как аннотировать словарь в Python?
Коллекции: list[int], dict[str, float], set[str], tuple[int, str] (фиксированный) и tuple[int, ...] (любой длины) — встроенные типы в скобках с Python 3.9. Необязательное значение — int | None (3.10+, раньше Optional[int]). Объединение — int | str. Функция — Callable[[int], str]. Неизвестный тип — Any, но он отключает проверку.
- Для параметров удобнее абстрактные типы: Iterable, Sequence, Mapping из collections.abc
- Optional не значит «необязательный аргумент» — это «может быть None»
- Псевдоним длинного типа: UserId = int или type UserId = int (3.12)
А ещё Перед использованием значения типа X | None нужно проверить его на None
Подробно
Примеры:
from collections.abc import Iterable
def total(prices: Iterable[float]) -> float: ...
def find_user(user_id: int) -> dict[str, str] | None: ...
def parse(value: str | bytes) -> int: ...
Почему Iterable в параметрах. Функции total подойдёт и список, и кортеж, и генератор. А возвращать лучше конкретный тип — list, чтобы вызывающий знал, что получит.
Проверка на None:
user = find_user(1)
if user is None:
return
print(user["name"]) # здесь анализатор знает, что user — dictЧто хотят услышать
- list[int], dict[str, X], tuple.
- X | None и Optional.
- Абстрактные типы для параметров.
- Сужение типа проверкой на None.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Optional[int] означает, что аргумент можно не передавать, а list[int] запрещает класть в список строки
- ✗Any — самый строгий тип, его стоит использовать везде
- ✓list[int], dict[str, float], int | None для возможного None, Iterable — для любых коллекций
- ✗Аннотировать dict можно только через typing.Dict
Разбор темы
- Аннотации типов, mypy и Pydantic
Что дают аннотации и кто их проверяет, как аннотировать коллекции, Optional и объединения, обобщённые типы, mypy в проекте, проверка данных Pydantic.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.