传递给另一个modu时lambda函数的作用域

2024-06-10 18:43:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着围绕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

Tags: 模块lambda函数namepyselfhellodef
2条回答

我认为创建和传递lambda函数与使用

def func(name):

但是,如果要在另一个模块中使用函数,我不认为将函数定义为lambda表达式有什么意义

结果是一样的,唯一的区别是你和你的函数定义不一致

The Python docs specifically discourage this

Always use a def statement instead of an assignment statement that binds a lambda expression directly to an identifier.

Yes:

def f(x): return 2*x

No:

f = lambda x: 2*x

The first form means that the name of the resulting function object is specifically 'f' instead of the generic ''. This is more useful for tracebacks and string representations in general. The use of the assignment statement eliminates the sole benefit a lambda expression can offer over an explicit def statement (i.e. that it can be embedded inside a larger expression)

这里的关键是,每个function对象都保留一个对定义函数的范围的引用

>>> func.__globals__['sayHello']
<function sayHello at 0x1085f2680>

这就是让func仍然调用sayHello的原因,即使是从具有不同全局作用域的函数调用。名称查找是静态的;它们只依赖于名称出现的词法(静态)上下文,而不依赖于运行时(动态)上下文。有些语言(Lisp、shell等)使用动态范围;不过,词汇或静态范围被广泛认为更容易推理

相关问题 更多 >