Дзен именованных кортежей в 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'])
Таким образом, в ситуациях, когда важна эффективность работы с памятью и интерпретируемость структуры данных, к которой обращаются только за чтением, работайте с именованными кортежами.