调用在 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

发生这种情况的根本原因是 lambdadef 做同样的事情,只是 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" 甚至 不同 。它所做的只是混淆。