Сложные типы: 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, strDict и 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: floatOptional[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 errorTypedDict
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 4Any и 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 — локальная установка не требуется.
Все уроки этого курса
- Основы аннотаций типов
- Сложные типы: List, Dict, Optional, Union
- TypeVar, обобщённые классы и Protocol
- Запуск mypy и исправление ошибок типов