Шаг 111.
Python: тонкости программирования. ... . Записи, структуры и объекты переноса данных. collections.namedtuple - удобные объекты данных

    На этом шаге мы рассмотрим этот класс с точки зрения структур данных.

    Класс namedtuple, доступный в Python 2.6+, предоставляет расширение встроенного типа данных tuple (см. 73 шаг). Аналогично определению собственного класса, применение именованного кортежа namedtuple позволяет определять "шаблоны" многократного использования для своих записей, гарантирующие использование правильных имен полей.

    Именованные кортежи неизменяемы, как и обычные кортежи. Это означает, что вы не можете добавлять новые поля или изменять существующие поля после того, как экземпляр namedtuple был создан.

    Помимо этого, именованные кортежи являются, скажем так, именованными кортежами (named tuples). Доступ к каждому хранящемуся в них объекту можно получить по уникальному идентификатору. Это освобождает от необходимости запоминать целочисленные индексы или идти обходными методами, например определять индексы целочисленных констант в качестве мнемокодов.

    На внутреннем уровне объекты namedtuple реализованы как обычные классы Python. В том, что касается использования оперативной памяти, они тоже "лучше" обычных классов и столь же эффективны с точки зрения потребляемой оперативной памяти, что и обычные кортежи:

>>> p1 = namedtuple('Point', 'x y z')(1, 2, 3)
>>> p2 = (1, 2, 3)
>>> getsizeof(p1)
64
>>> getsizeof(p2)
64

    Именованные кортежи могут довольно просто привести в порядок исходный код и сделать его более удобочитаемым, обеспечив вашим данным более совершенную структуру.

    Переход от ситуативных типов данных, таких как словари с фиксированным форматом, к именованным кортежам помогает яснее выражать свои намерения. Нередко применение этой рефакторизации каким-то невообразимым образом приводит к более совершенному решению проблемы.

    Использование именованных кортежей вместо неструктурированных кортежей и словарей может облегчить жизнь и коллегам, потому что именованные кортежи позволяют раздавать данные в "самодокументированном" виде (в известной степени).

>>> from collections import namedtuple
>>> Car = namedtuple('Авто', 'цвет пробег автомат')
>>> car1 = Car('красный', 3812.4, True)
# Экземпляры имеют хороший метод repr:
>>> car1
Авто(цвет='красный', пробег=3812.4, автомат=True)
# Доступ к полям:
>>> car1.пробег
3812.4
# Поля неизменяемы:
>>> car1.пробег = 12
Traceback (most recent call last):
.   .   .   .
AttributeError: can't set attribute
>>> car1.лобовое_стекло = 'треснутое'
Traceback (most recent call last):
.   .   .   .
AttributeError: 'Авто' object has no attribute 'лобовое_стекло'

    На следующем шаге мы рассмотрим класс typing.NamedTuple.




Предыдущий шаг Содержание Следующий шаг