python - 传递给另一个模块时 lambda 函数的范围

标签 python lambda scope

我正在尝试了解 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/

相关文章:

coldfusion - Coldfusion中的var关键字以及使用次数

c++ - 使用 lambda 函数模拟词法闭包是否存在不可预见的性能/实现问题?

C# 如何根据每个项目中的字符子集使用 lambda 表达式对字符串列表进行排序

c# - 找不到类型或命名空间,但它在那里

c++ - 宏中变量的范围

c++ - lambda 是静态的是什么意思?

python - Spacy Matcher 日期模式将匹配连字符,但不匹配正斜杠?

python - 获取 Lambda 演算表达式中的谓词

python - 在满足预期奴隶数量后,Locust master 会接受并使用额外的奴隶吗?

javascript - 如何将带有嵌入式对象的对象从 JavaScript (jQuery/ajax) 传递到 Python (Flask)?