>>> class Potato(object):
... def method(self, spam):
... print self, spam
...
>>> spud = Potato()
使用:
>>> Potato.method(spud, **{'spam': 123})
<__main__.Potato object at 0x7f86cd4ee9d0> 123
不能工作:
>>> Potato.method(**{'self': spud, 'spam': 123})
# TypeError
但为什么不呢?我以为自己&#39;这只是一个惯例,这个论点没有任何内在的特殊之处?
答案 0 :(得分:12)
Python 2的instancemethod
包装器对象坚持检查第一个位置参数,并且该检查不支持关键字参数,完全停止:
>>> Potato.method(self=spud, spam=123)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unbound method method() must be called with Potato instance as first argument (got nothing instead)
请注意,我没有在那里使用参数解包!
你可以使用位置参数:
>>> Potato.method(*(spud,), **{'spam': 123})
<__main__.Potato object at 0x1002b57d0> 123
或者您可以访问原始功能对象:
>>> Potato.method.__func__(**{'self': spud, 'spam': 123})
<__main__.Potato object at 0x1002b57d0> 123
绕过这个限制。
Python 3不再为未绑定的方法使用方法包装器;直接返回底层函数。