Alexey Kachayevによるすでに優れた回答に追加することはあまりありませんが、役立つ可能性のあるものの1つは、次のパターンです。
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
ただし、関数内に適切なオブジェクトがあることを確認することで、簡単にもっと凝ったものにすることができます。