typing.NamedTuple
Добавляйте аннотации типов к именованным кортежам
«typing.NamedTuple» — бесплатный урок Python Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Python Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Python Academy содержит 4 уроков всего.
Типизированная альтернатива
Базовый класс typing.NamedTuple — это современный способ на основе классов определять именованные кортежи. Он добавляет аннотации типов и выглядит как обычный класс, который большинство редакторов и средств проверки типов понимают лучше, чем вариант с фабричной функцией.
Синтаксис на основе классов
Унаследуйте NamedTuple и объявите каждое поле с аннотацией типа. В результате всё равно получится настоящий кортеж.
from typing import NamedTuple
class Point(NamedTuple):
x: int
y: int
p = Point(1, 2)
print(p)То же поведение кортежа
Всё из фабричного варианта по-прежнему работает: доступ по имени, доступ по индексу, распаковка и неизменяемость.
from typing import NamedTuple
class Point(NamedTuple):
x: int
y: int
p = Point(1, 2)
print(p.x, p[1])
x, y = p
print(x, y)Значения по умолчанию в теле класса
Чтобы задать полю значение по умолчанию, просто присвойте значение в теле класса. Поля со значениями по умолчанию должны идти после полей без значений по умолчанию.
from typing import NamedTuple
class Point(NamedTuple):
x: int
y: int
z: int = 0
print(Point(1, 2))
print(Point(1, 2, 9))Добавление методов
Поскольку это класс, в него можно добавлять настоящие методы. Фабрика collections.namedtuple не позволяет сделать это так же удобно.
from typing import NamedTuple
class Point(NamedTuple):
x: int
y: int
def distance_sq(self):
return self.x ** 2 + self.y ** 2
print(Point(3, 4).distance_sq())Свойства тоже доступны
Можно также определять вычисляемые свойства, которые получают значения из полей.
from typing import NamedTuple
class Rectangle(NamedTuple):
width: int
height: int
@property
def area(self):
return self.width * self.height
print(Rectangle(3, 4).area)Вспомогательные методы сохраняются
Знакомые вспомогательные средства кортежей по-прежнему доступны: _replace(), _asdict() и _fields работают так же.
from typing import NamedTuple
class Point(NamedTuple):
x: int
y: int
p = Point(1, 2)
print(p._asdict())
print(p._replace(x=9))Аннотации типов описывают назначение
Аннотации не проверяются во время выполнения, но документируют ожидаемые типы и позволяют инструментам статического анализа типов обнаруживать ошибки до запуска программы.
from typing import NamedTuple
class Employee(NamedTuple):
name: str
salary: float
active: bool = True
e = Employee('Alice', 5000.0)
print(e)NamedTuple и класс данных
Как выбрать между ними:
- NamedTuple: неизменяемый, похожий на кортеж, поддерживает индексацию и распаковку.
- класс данных: по умолчанию изменяемый (или замороженный), без индексации, с большими возможностями настройки.
- Выбирайте NamedTuple, когда важно поведение кортежа; выбирайте класс данных для более содержательных записей.
Вложенность и композиция
Именованные кортежи хорошо сочетаются друг с другом. Полем может быть другой именованный кортеж, что позволяет создавать структурированные неизменяемые данные.
from typing import NamedTuple
class Point(NamedTuple):
x: int
y: int
class Line(NamedTuple):
start: Point
end: Point
line = Line(Point(0, 0), Point(3, 4))
print(line.end.y)В качестве возвращаемых типов функций
Укажите в аннотации, что функция возвращает ваш NamedTuple, чтобы редакторы знали типы полей результата. Аннотация документирует структуру возвращаемой записи.
from typing import NamedTuple
class Stats(NamedTuple):
minimum: int
maximum: int
def analyze(nums) -> Stats:
return Stats(min(nums), max(nums))
r = analyze([5, 2, 8])
print(r.minimum, r.maximum)Быстрая проверка
В чём преимущество typing.NamedTuple перед фабрикой collections.namedtuple?
Итоги
Вы научились добавлять аннотации типов к именованным кортежам.
- Создавайте подкласс
typing.NamedTupleс аннотированными полями. - Задавайте значения по умолчанию в теле класса; добавляйте методы и свойства.
- Вспомогательные средства
_replace,_asdict,_fieldsпо-прежнему работают. - Для большей понятности и лучшей поддержки инструментами предпочитайте его фабрике.
Часто задаваемые вопросы
Урок «typing.NamedTuple» бесплатный?
Да — полный текст урока «typing.NamedTuple» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Python Academy, подпишись на CoddyKit PRO. Курс Python Academy содержит 4 уроков всего.
Чему я научусь в уроке «typing.NamedTuple»?
Добавляйте аннотации типов к именованным кортежам Ты практикуешь Python Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Python Academy?
Предыдущий опыт не требуется. Python Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «typing.NamedTuple»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Python Academy?
Да. Каждый урок Python Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Класс Enum
- IntEnum и Flag
- Основы NamedTuple
- typing.NamedTuple