Вопрос с собеседования · Python

Как аннотировать списки, словари, необязательные значения и объединения типов?

JuniorОкружение и инструменты
Ещё спрашивают так:
  • Как написать тип 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

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования