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

2024-09-25 02:39:40 发布

您现在位置: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.

这样做的唯一目的是增加代码的可读性

谢谢你


Tags: 实例方法new属性johnnamedtuple命名bob
1条回答
网友
1楼 · 发布于 2024-09-25 02:39:40

这在技术上是可行的,并且是半自我记录的:

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_kwsclassmethod添加到生成的类中:

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)

相关问题 更多 >