我正在尝试了解 Lambda 函数的范围。我注意到我可以在一个模块 A 中创建一个 lambda 函数,并将其传递给另一个模块 B 中的函数,但能够从模块 A< 调用函数/强> .
像这样传递 lambda 函数是不好的做法,还是有更优选的(最佳实践)方法来处理这个问题?
target.py
class TestLambda():
def __init__(self,name):
self.name = name
def call(self,func):
func(self.name)
source.py
from target import TestLambda
def sayHello(name):
print("Hello {}".format(name))
func = lambda n: sayHello(n)
l = TestLambda("John")
l.call(func)
输出
➜ lambda-test python3 source.py
Hello John
最佳答案
这里的关键是每个function
对象都保留对函数定义范围的引用。
>>> func.__globals__['sayHello']
<function sayHello at 0x1085f2680>
这就是让 func
仍然可以调用 sayHello
的原因,即使是从具有不同全局作用域的函数调用时也是如此。名称查找是静态的;它们仅依赖于名称出现的词汇(静态)上下文,而不依赖于运行时(动态)上下文。有些语言(Lisp、shell 等)使用动态作用域;不过,人们普遍认为词法或静态作用域更容易推理。
关于python - 传递给另一个模块时 lambda 函数的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58011768/