python
February 13, 2023

Дзен именованных кортежей в Python

Рассмотрим, способы и цели применения именованных кортежей в Python:

from collections import namedtuple

Model = namedtuple('complex_model', ['name', 'columns', 'model'])

При создании нового класса в качестве первого аргумента передается имя, которое используется в __repr__ при отображении объекта в консоли, а второго - имена свойств. Затем экземпляры создаются путем перечисления значений свойств:

from sklearn.tree import DecisionTreeRegressor
from sklearn.linear_model import LinearRegression

model1 = Model('tree', ['col1', 'col2'], DecisionTreeRegressor())
model2 = Model('linear', ['col1', 'col3'], LinearRegression())

display(model1)
display(model2)

Отмечу, что перечисление свойств при создании нового класса namedtuple можно сделать в строке через пробел (а не в списке, как выше):

ModelAlt = namedtuple('complex_model_alt', 'name columns model')
model3 = ModelAlt('tree', ['col1', 'col2'], DecisionTreeRegressor())
display(model3)

Преимуществом namedtuple является то, что, с одной стороны, они реализованы как обычные классы Python, с другой - оптимальнее расходуют оперативную память (как обычные кортежи). К значениям свойств можно получать доступ через точку или индекс:

display(model2.columns)
display(model1[0])

Свойства именованного кортежа не изменяются, поэтому их применяют, когда операции записи не требуются, а происходит частое чтение:

model1.name='tree_model'

Именованные кортежи имеют ряд удобных атрибутов и методов, упрощающих работу с ними (по соглашению начинаются с _, чтобы избежать конфликтов с именами пользовательских полей). Так, для перечисления свойств, воспользуйтесь атрибутом _fields:

model1._fields

_asdict() возвращает содержимое именованного кортежа в виде словаря:

_replace создает копию кортежа и позволяет вам выборочно заменять некоторые его поля:

model2._replace(columns=['col1'])

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