この機能がある場合:
def foo(arg_one, arg_two):
pass
次のようにラップできます。
def bar(arg_one, arg_two):
return foo(arg_one, arg_two)
foo = bar
foo の必要な引数を知らなくてもこれを行うことは可能ですか?
引数のアンパック演算子 (またはそれらが呼ばれるもの)を使用できます。
def bar(*args, **kwargs):
return foo(*args, **kwargs)
キーワード引数を渡す予定がない場合は、 を削除できます**kwargs
。
あなたは使用することができ*args
ます**kwargs
:
def bar(*args, **kwargs):
return foo(*args, **kwargs)
args
位置引数のリストです。
kwargs
キーワード引数の辞書です。
これらの変数args
の呼び出しkwargs
は単なる命名規則であることに注意してください。*
引数を**
アンパックするためのすべての魔法を実行します。
以下も参照してください。
これは、もう少し一般的な使用例です (Blender による回答に加えて):
通常、OOP でオブジェクトを拡張する場合、実際にはメソッドをオーバーライドし、(慎重に) シグネチャ(拡張メソッドの引数の順序と数) を拡張または変更する__init__()
必要があります (たとえば、オブジェクト コンストラクターであるメソッド)。
この目的で *args, **kwds を適用する方法の例を次に示します。
class Foo(object):
def __init(self, foo_positional_arg, foo_optional_arg=None):
pass
class Bar(Foo):
def __init__(self, bar_postional_arg, bar_optional_arg=None, *args, **kwds):
self.bar_postional_arg = bar_postional_arg
self.bar_optional_arg = bar_optional_arg
super(Bar, self).__init__(*args, **kwds)
実際、署名の順序を実際に変更したり、前の (ラップされた) 完全または部分的な署名から引数をトラップしたりすることができます。
def __init__(self, bar_postional_arg, foo_positional, foo_optional_arg=False, bar_optional_arg=None, *args, **kwds):
これは、python 関数 (およびメソッド) の *args, **kwds メカニズムがいかに非常に柔軟 (!) であるかを再度証明しています。