0Pricing
Python Academy · Урок

Сложные типы: List, Dict, Optional, Union

Корректно используйте обобщённые типы модуля typing и Optional/Union.

«Сложные типы: List, Dict, Optional, Union» — бесплатный урок Python Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Python Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Python Academy содержит 4 уроков всего.

Обзор модуля typing

До Python 3.9 обобщённые типы, такие как List, Dict и Tuple, импортировались из typing. Начиная с версии 3.9 можно использовать встроенные типы напрямую.

from typing import List, Dict, Tuple, Optional, Union

# Python 3.9+: use list[int], dict[str,int] directly
# Python 3.8-: use typing.List[int], typing.Dict[str,int]

List и Sequence

Используйте list[T] для изменяемых последовательностей, а Sequence[T] — когда функция принимает любую упорядоченную последовательность: список, кортеж или строку.

from typing import Sequence

def total(nums: list[int]) -> int:
    return sum(nums)

def first(items: Sequence[str]) -> str:
    return items[0]   # works with list, tuple, str

Dict и Mapping

Используйте dict[K,V] для изменяемых словарей, а Mapping[K,V] — для объектов только для чтения, подобных словарям.

from typing import Mapping

def lookup(data: Mapping[str, int], key: str) -> int | None:
    return data.get(key)

result = lookup({"a": 1, "b": 2}, "a")
print(result)   # 1

Аннотации кортежей

Фиксированная длина: tuple[int, str, float]. Переменная длина: tuple[int, ...].

def point() -> tuple[float, float]:
    return (1.0, 2.0)

def first_n(n: int) -> tuple[int, ...]:
    return tuple(range(n))

# Named tuple with types:
from typing import NamedTuple
class Point(NamedTuple):
    x: float
    y: float

Optional[T]

Optional[T] — это сокращённая запись для T | None. Всегда используйте этот вариант, когда параметр может отсутствовать.

from typing import Optional

def find_user(user_id: int) -> Optional[dict[str, str]]:
    db: dict[int, dict[str, str]] = {
        1: {"name": "Alice"}
    }
    return db.get(user_id)

Типы Union

Используйте Union[X, Y] или X | Y (3.10+), если значения могут иметь один из нескольких типов.

from typing import Union

def stringify(value: Union[int, float, str]) -> str:
    return str(value)

# Python 3.10+:
def stringify2(value: int | float | str) -> str:
    return str(value)

Типы Literal

Literal["a","b","c"] ограничивает значение определённым набором литералов.

from typing import Literal

Mode = Literal["read", "write", "append"]

def open_file(path: str, mode: Mode) -> None:
    with open(path, mode):
        pass

open_file("data.txt", "read")    # ok
# open_file("data.txt", "exec")  # mypy error

TypedDict

TypedDict аннотирует структуру словаря, в которой каждому ключу соответствует определённый тип.

from typing import TypedDict

class User(TypedDict):
    name: str
    age: int
    email: str | None

def greet(user: User) -> str:
    return f"Hello, {user['name']}"

alice: User = {"name": "Alice", "age": 30, "email": None}

Множества и FrozenSet

Аннотируйте множества с помощью set[T], а неизменяемые множества — с помощью frozenset[T].

def unique(items: list[int]) -> set[int]:
    return set(items)

def allowed_methods() -> frozenset[str]:
    return frozenset({"GET", "POST", "DELETE"})

Iterable и Iterator

Используйте Iterable[T] для любого объекта, по которому можно выполнять цикл, а Iterator[T] — для объектов с методом __next__.

from typing import Iterable, Iterator

def evens(numbers: Iterable[int]) -> Iterator[int]:
    return (n for n in numbers if n % 2 == 0)

for n in evens([1, 2, 3, 4, 5]):
    print(n)   # 2 4

Any и NoReturn

Any отключает проверку типов для значения. NoReturn помечает функции, которые никогда не возвращают управление: они всегда вызывают исключение или выполняются бесконечно.

from typing import Any, NoReturn

def accept_all(x: Any) -> None:
    print(x)

def crash(msg: str) -> NoReturn:
    raise RuntimeError(msg)   # never returns normally

Быстрая проверка

Что означает Optional[str]?

Итоги

Используйте list[T], dict[K,V], tuple[T,...] для коллекций. Optional[T] = T | None. Используйте Union[X,Y] или X|Y для нескольких типов, Literal для определённых значений, TypedDict для типизированных структур словарей и Any для отключения проверки типов.

Часто задаваемые вопросы

Урок «Сложные типы: List, Dict, Optional, Union» бесплатный?

Да — полный текст урока «Сложные типы: List, Dict, Optional, Union» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Python Academy, подпишись на CoddyKit PRO. Курс Python Academy содержит 4 уроков всего.

Чему я научусь в уроке «Сложные типы: List, Dict, Optional, Union»?

Корректно используйте обобщённые типы модуля typing и Optional/Union. Ты практикуешь Python Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Python Academy?

Предыдущий опыт не требуется. Python Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Сложные типы: List, Dict, Optional, Union»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Python Academy?

Да. Каждый урок Python Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Основы аннотаций типов
  2. Сложные типы: List, Dict, Optional, Union
  3. TypeVar, обобщённые классы и Protocol
  4. Запуск mypy и исправление ошибок типов
← Назад к Python Academy