我沒有太多的添加到由阿列克謝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
這可能看起來像黑魔法 - 它確實對我來說是第一次,但它在Data Model所有記錄並在this post中進行了討論。
在行動:
>>> 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'已經足夠好了(用代碼示例添加完整答案) –