Python ** kwargs和self作为参数

时间:2013-01-15 16:13:31

标签: python python-2.7 arguments kwargs

我在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)

并打印:

  

formal arg: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作为参数?

1 个答案:

答案 0 :(得分:5)

在这种情况下,您不能将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 catchall下并传递给基础函数,*args为空。

但是您定义的test_var_kwargs方法有一个位置参数(在self旁边,因此会引发异常。