在创建namedtuple实例时是否可以指定属性名称?

时间:2014-06-01 15:37:50

标签: python

要在Python中创建和使用命名元组,通常它是这样的:

MyTuple = namedtuple('MyTuple', ['attr1', 'attr2', 'attr3'])  
new_tuple = MyTuple('Bob', 'John', 'Tom')

创建实例时有没有办法指定属性?

例如,我想做类似的事情:

new_tuple = MyTuple(attr1='Bob', attr2='John', attr3='Tom') # this does NOT work.

唯一的目标是在我的代码中添加可读性。

谢谢。

1 个答案:

答案 0 :(得分:1)

这将在技术上有效并且是半自我记录的:

new_tuple = namedtuple('MyTuple', ['attr1', 'attr2', 'attr3'])('Bob', 'John', 'Tom')

当然,你每次都在创建一个新类,效率很低。因此,您可以根据需要编写辅助函数来使用关键字:

def nt_from_kws(cls, **kw):
    return cls(*(kw[k] for k in cls._fields))

用法:

MyTuple = namedtuple('MyTuple', ['attr1', 'attr2', 'attr3'])
new_tuple = nt_from_kws(MyTuple, attr1=1, attr2=2, attr3=3)

为了获得更多乐趣,请编写一个替换namedtuple工厂,将from_kws类方法添加到生成的类中:

from collections import namedtuple

@classmethod
def from_kws(cls, **kw):
    return cls(*(kw[k] for k in cls._fields))

def namedtuple(name, fields, namedtuple=namedtuple):
     nt = namedtuple(name, fields)
     nt.from_kws = from_kws
     return nt

用法:

MyTuple = namedtuple('MyTuple', ['attr1', 'attr2', 'attr3'])
new_tuple = MyTuple.from_kws(attr1=1, attr2=2, attr3=3)