调用在 class 范围内定义的 lambda 方法(作为 class 属性)
Calling lambda method defined in class scope (as a class attribute)
class _GhostLink(object):
toGhost = lambda filename: False
class _Mod_AllowGhosting_All(_GhostLink):
def _loop(self):
# ...
if self.__class__.toGhost(fileName) != oldGhost:...
产生:
Traceback (most recent call last):
File "bash\basher\mod_links.py", line 592, in Execute
changed = self._loop()
File "bash\basher\mod_links.py", line 587, in _loop
if self.__class__.toGhost(fileName) != oldGhost:
TypeError: unbound method <lambda>() must be called with _Mod_AllowGhosting_All instance as first argument (got Path instance instead)
在 if self.toGhost(fileName) != ...
中传递实例时会导致:
Traceback (most recent call last):
File "bash\basher\mod_links.py", line 592, in Execute
changed = self._loop()
File "bash\basher\mod_links.py", line 587, in _loop
if self.toGhost(fileName) != oldGhost:
TypeError: <lambda>() takes exactly 1 argument (2 given)
为什么 toGhost
表现为 class 方法 实例方法?
编辑:我知道 class、static 等方法的区别——这是一个句法问题
看起来你想要一个静态方法:
class _GhostLink(object):
toGhost = staticmethod(lambda filename: False)
或:
class _GhostLink(object):
@staticmethod
def toGhost(filename):
return False
发生这种情况的根本原因是 lambda
和 def
做同样的事情,只是 def
还分配了一个变量,也就是说,两个构造都产生了一个函数。
将函数(无论是来自 lambda
还是 def
)绑定到实例方法中是因为函数也是描述符;请记住,在每种情况下:
foo = lambda (...): (...)
等同于:
def foo(...):
return (...)
所以当你说:
class _GhostLink(object):
toGhost = lambda filename: False
就像你说的一样:
class _GhostLink(object):
def toGhost(filename):
return False
所以这个故事的寓意是你应该永远不要使用lambda
作为赋值的右边;它与使用 def
没有 "better" 甚至 不同 。它所做的只是混淆。
class _GhostLink(object):
toGhost = lambda filename: False
class _Mod_AllowGhosting_All(_GhostLink):
def _loop(self):
# ...
if self.__class__.toGhost(fileName) != oldGhost:...
产生:
Traceback (most recent call last):
File "bash\basher\mod_links.py", line 592, in Execute
changed = self._loop()
File "bash\basher\mod_links.py", line 587, in _loop
if self.__class__.toGhost(fileName) != oldGhost:
TypeError: unbound method <lambda>() must be called with _Mod_AllowGhosting_All instance as first argument (got Path instance instead)
在 if self.toGhost(fileName) != ...
中传递实例时会导致:
Traceback (most recent call last):
File "bash\basher\mod_links.py", line 592, in Execute
changed = self._loop()
File "bash\basher\mod_links.py", line 587, in _loop
if self.toGhost(fileName) != oldGhost:
TypeError: <lambda>() takes exactly 1 argument (2 given)
为什么 toGhost
表现为 class 方法 实例方法?
编辑:我知道 class、static 等方法的区别——这是一个句法问题
看起来你想要一个静态方法:
class _GhostLink(object):
toGhost = staticmethod(lambda filename: False)
或:
class _GhostLink(object):
@staticmethod
def toGhost(filename):
return False
发生这种情况的根本原因是 lambda
和 def
做同样的事情,只是 def
还分配了一个变量,也就是说,两个构造都产生了一个函数。
将函数(无论是来自 lambda
还是 def
)绑定到实例方法中是因为函数也是描述符;请记住,在每种情况下:
foo = lambda (...): (...)
等同于:
def foo(...):
return (...)
所以当你说:
class _GhostLink(object):
toGhost = lambda filename: False
就像你说的一样:
class _GhostLink(object):
def toGhost(filename):
return False
所以这个故事的寓意是你应该永远不要使用lambda
作为赋值的右边;它与使用 def
没有 "better" 甚至 不同 。它所做的只是混淆。