2013-01-15 47 views
0

我没有太多的python经验,但我正在学习**kwargsPython ** kwargs和自我作为参数

Afer reading a lot我了解了一些关于**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) 

并打印:

正式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) 

但是,这会产生错误

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

我明白,我必须通过自我喜欢:

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

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

+1

你可能包括**类功能的完整代码示例**的例子。我想你可能 – Wessie

+1

不需要传递'frag = 1',只需将它传递为'1' – namit

+1

因为它只计算'farg = 1'作为关键字参数 –

回答

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包罗万象下集中并传递给底层函数,与*args空。

但是你定义的test_var_kwargs方法有一个位置参数(旁边self,从而产生一个异常。

+0

但我为什么要在论据中包含自我? –

+1

@JimmyKane:请参阅[Python自我解释](http://stackoverflow.com/q/2709821) –

+0

在我看来,'farg'不会被同时解释为位置和关键字参数。通过适当的类/对象语法,我的机器可以产生预期的结果。 –

相关问题