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作为参数?
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,因此会引发异常).
| 归档时间: |
|
| 查看次数: |
2102 次 |
| 最近记录: |