3

この機能がある場合:

def foo(arg_one, arg_two):
    pass

次のようにラップできます。

def bar(arg_one, arg_two):
    return foo(arg_one, arg_two)

foo = bar

foo の必要な引数を知らなくてもこれを行うことは可能ですか?

4

4 に答える 4

5

引数のアンパック演算子 (またはそれらが呼ばれるもの)を使用できます。

def bar(*args, **kwargs):
    return foo(*args, **kwargs)

キーワード引数を渡す予定がない場合は、 を削除できます**kwargs

于 2013-06-26T18:57:37.783 に答える
4

あなたは使用することができ*argsます**kwargs

def bar(*args, **kwargs):
    return foo(*args, **kwargs)

args位置引数のリストです。

kwargsキーワード引数の辞書です。

これらの変数argsの呼び出しkwargsは単なる命名規則であることに注意してください。*引数を**アンパックするためのすべての魔法を実行します。

以下も参照してください。

于 2013-06-26T18:57:04.067 に答える
2

これは、もう少し一般的な使用例です (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 メカニズムがいかに非常に柔軟 (!) であるかを再度証明しています。

于 2013-06-26T19:34:13.977 に答える