2015-07-21 63 views
4

我想在不同的模块中定义一个lambda函数,它将被执行。在lambda将被调用的模块中,有方法当lambda被定义时不可用。事实上,当lambda尝试使用这些函数时,Python会抛出一个错误。使用(截至目前)Python中的Lambda函数中的未定义函数

例如,我有两个模块。

lambdaSource.py:

def getLambda(): 
    return lambda x: squareMe(x) 

runMe.py

import lambdaSource 

def squareMe(x): 
    return x**2 

if __name__ == '__main__': 
    theLambdaFunc = lambdaSource.getLambda() 
    result  = theLambdaFunc(5) 

如果运行runMe.py,你会得到一个名称错误:NameError: global name 'squareMe' is not defined

我能解决这个问题的唯一途径在运行时修改lambda的全局变量字典。

theLambdaFunc.func_globals['squareMe'] = squareMe 

这个例子很有意思,但这是我所期望的行为。任何人都可以解释为什么第一个例子不起作用?为什么'squareMe'不适用于lambda函数的范围?特别是,如果我只是定义了函数squareMe下的lambda,那么一切正常?

+2

难道你不能让'getLambda'接受一个参数并传递函数,例如'getLambda(f):return lambda x:f(x)'?我看不出为什么你需要按照你现在这样做的方式去做。 – Marius

+0

要清楚,这个例子只是说明了这个问题。实际上,lambda函数来自一个静态的configuration.ini文件,由另一个python模块解析,然后传递给更高级别的模块执行。 –

回答

3

您在单独的模块中定义了getLambdasquareMelambdaSource模块只能看到其范围中定义的内容 - 即,您直接在其中定义的所有内容以及其中的所有内容import

要使用squareMegetLambda,你需要lambdaSource.pyfrom runMe import squareMe声明(而不是周围的其他方法,你似乎在做)。

+0

这是有道理的,但我也会认为,使用解释性语言,lambda将在执行时具有可用的范围 –

+0

这与语言的实现方式无关(顺便说一句,Python是字节码 - 编译,而不是解释)。这完全是一个设计决定:lambda * does *实际上可以访问封闭范围内的所有内容。这只是说范围是模块*的范围(Python除了内置的内容外没有真正的全局范围概念)。 –