Python**kwargs和self作为参数

Jim*_*ane 1 python arguments kwargs python-2.7

我没有太多的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)
Run Code Online (Sandbox Code Playgroud)

并打印:

正式的arg: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)
Run Code Online (Sandbox Code Playgroud)

但这会产生错误:

TypeError: test_var_kwargs() takes exactly 2 arguments (1 given)
Run Code Online (Sandbox Code Playgroud)

我明白我必须通过自我:

self.test_var_kwargs(self, farg=1, myarg2="two", myarg3=3)
Run Code Online (Sandbox Code Playgroud)

为什么我必须在类实例的方法中包含self作为参数?

Mar*_*ers 5

farg在这种情况下,您不能使用关键字参数; 它不能被解释为位置关键字参数,在这种情况下,Python将其解释为关键字参数.

使用

self.test_var_kwargs(self, 1, myarg2="two", myarg3=3)
Run Code Online (Sandbox Code Playgroud)

代替.

函数充当描述符; 当查看一个实例时,它们被包装在一个名为方法的新对象中,该方法在调用时自动将该实例作为第一个参数添加到该函数中.这个包装器基本上是这样做的:

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)
Run Code Online (Sandbox Code Playgroud)

farg然后将您的关键字参数集中在**kwcatchall下并传递给基础函数,并*args留空.

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