Найти тему
Властелин машин

Дзен именованных кортежей в 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)

-2

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

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

-3

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

model1.name='tree_model'

-4

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

model1._fields

-5

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

model1._asdict().items()

-6

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

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

-7

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

-8

Наука
7 млн интересуются