对于 Alexey Kachayev 已经非常出色的答案,我没有什么要补充的——但是,可能有用的一件事是以下模式:
Pruefer.__new__.func_defaults = (1,float('inf'),"")
这将允许您创建一个工厂函数,该函数返回一个可以具有默认参数的新命名元组:
def default_named_tuple(name,args,defaults=None):
named_tuple = collections.namedtuple(name,args)
if defaults is not None:
named_tuple.__new__.func_defaults = defaults
return named_tuple
这可能看起来像黑魔法——起初它对我有用,但它都记录在数据模型中并在这篇文章中进行了讨论。
在行动:
>>> default_named_tuple("Pruefer", "ident maxNum name",(1,float('inf'),''))
<class '__main__.Pruefer'>
>>> Pruefer = default_named_tuple("Pruefer", "ident maxNum name",(1,float('inf'),''))
>>> Pruefer()
Pruefer(ident=1, maxNum=inf, name='')
>>> Pruefer(3)
Pruefer(ident=3, maxNum=inf, name='')
>>> Pruefer(3,10050)
Pruefer(ident=3, maxNum=10050, name='')
>>> Pruefer(3,10050,"cowhide")
Pruefer(ident=3, maxNum=10050, name='cowhide')
>>> Pruefer(maxNum=12)
Pruefer(ident=1, maxNum=12, name='')
并且仅将一些参数指定为默认值:
>>> Pruefer = default_named_tuple("Pruefer", "ident maxNum name",(float('inf'),''))
>>> Pruefer(maxNum=12)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __new__() takes at least 2 arguments (2 given)
>>> Pruefer(1,maxNum=12)
Pruefer(ident=1, maxNum=12, name='')
请注意,正如所写,将 a 传入tuple
as可能是安全的defaults
。tuple
但是,通过确保函数中有一个合理的对象,您可以轻松获得更多花哨的东西。