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:两个

另一个关键字 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 像:

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您定义的方法有一个位置参数(在 旁边self,因此会引发异常。

于 2013-01-15T16:15:49.463 回答