要在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.
唯一的目标是在我的代码中添加可读性。
谢谢。
答案 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)