3

私はPythonの経験はあまりありませんが、勉強してい**kwargsます。

たくさん読んだ**kwargs後、何かを理解しましたが、小さな問題がある、正しいことを理解していません。

したがって、これは機能します:

def test_var_kwargs(farg, **kwargs):
    print "formal arg:", farg
    for key in kwargs:
        print "another keyword arg: %s: %s" % (key, kwargs[key])

test_var_kwargs(farg=1, myarg2="two", myarg3=3)

そしてプリント:

仮引数: 1

別のキーワード arg: myarg2: two

別のキーワード arg: myarg3: 3

ただし、その関数がインスタンス関数である場合は、self含める必要があります。

def test_var_kwargs(self, farg, **kwargs):
        print "formal arg:", farg
        for key in kwargs:
            print "another keyword arg: %s: %s" % (key, kwargs[key])
    
self.test_var_kwargs(farg=1, myarg2="two", myarg3=3)

しかし、これはエラーを生成します:

TypeError: test_var_kwargs() takes exactly 2 arguments (1 given)

私は自分自身を次のように渡す必要があることを理解しています:

self.test_var_kwargs(self, farg=1, myarg2="two", myarg3=3)

クラス インスタンスのメソッドに引数として self を含める必要があるのはなぜですか?

4

1 に答える 1

7

fargその場合、キーワード引数として使用できません。位置引数とキーワード引数の両方として解釈することはできません。この場合、Python はキーワード引数として解釈します。

使用する

self.test_var_kwargs(self, 1, myarg2="two", myarg3=3)

代わりは。

関数は記述子として機能します。インスタンスを検索すると、メソッドと呼ばれる新しいオブジェクトにラップされ、呼び出されたときにインスタンスが関数の最初の引数として自動的に追加されます。このラッパーは基本的にこれを行います:

class Method(object):
    def __init__(self, function, instance, cls):
        self.func = function
        self.instance = instance
        self.cls = cls

    def __call__(self, *args, **kw):
        return self.func(self.instance, *args, **kw)

次にfarg、キーワード引数はキャッチオールの下にまとめられ、空のまま**kwで基礎となる関数に渡されます。*args

しかし、test_var_kwargs定義したメソッドには 1 つの位置引数 ( の隣) がselfあるため、例外が発生します。

于 2013-01-15T16:15:49.463 に答える