我在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作为参数?
答案 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
旁边,因此会引发异常。