调用类范围中定义的lambda方法(作为类属性)

时间:2015-05-08 19:52:44

标签: python python-2.7 lambda class-method

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

installsoftware.ps1 -DeployModules "Base, Pack1, Pack3" installsoftware.ps1 -DeployModules "All" 如何表现为 classmethod 实例方法?

编辑:我知道类,静态等方法的区别 - 这是一个句法问题

2 个答案:

答案 0 :(得分:4)

看起来你想要一个静态方法:

class _GhostLink(object):
    toGhost = staticmethod(lambda filename: False)

或:

class _GhostLink(object):
    @staticmethod
    def toGhost(filename):
        return False

答案 1 :(得分:2)

发生这种情况的原因基本上是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作为任务的右侧;它不是&#34;更好&#34;甚至使用def 。所有这一切都让人感到困惑。