我没有太多要补充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='')
请注意,如所述,只有将
tuple
作为
defaults
传递才是安全的。但是,您可以通过确保在函数内部具有合理的
tuple
对象来轻松地变得更加复杂。
namedtuple
已经足够好了(附带完整的代码示例)。 - Alexey Kachayevnamedtuple
现在允许在3.7+版本中设置默认值。 - pylang