我试着围绕Lambda函数的范围来思考。我注意到我可以在一个模块a中创建lambda函数并将其传递给另一个模块B中的函数,但是可以从模块a调用函数
像这样传递lambda函数是一种不好的做法,还是有一种更好的(最佳做法)方法来处理这个问题
目标.py
class TestLambda():
def __init__(self,name):
self.name = name
def call(self,func):
func(self.name)
源.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
我认为创建和传递lambda函数与使用
def func(name):
但是,如果要在另一个模块中使用函数,我不认为将函数定义为lambda表达式有什么意义
结果是一样的,唯一的区别是你和你的函数定义不一致
The Python docs specifically discourage this:
这里的关键是,每个
function
对象都保留一个对定义函数的范围的引用这就是让
func
仍然调用sayHello
的原因,即使是从具有不同全局作用域的函数调用。名称查找是静态的;它们只依赖于名称出现的词法(静态)上下文,而不依赖于运行时(动态)上下文。有些语言(Lisp、shell等)使用动态范围;不过,词汇或静态范围被广泛认为更容易推理相关问题 更多 >
编程相关推荐