Python lambda是在调用脚本的上下文中执行还是在已定义脚本的上下文中执行?

Python lambda是在调用脚本的上下文中执行还是在已定义脚本的上下文中执行?,python,Python,如果以下函数在不同的文件中定义,并在单独的文件中返回和执行,它会给出定义它的文件名吗?或者它的名字在哪里 File1.py ----- def get_current_filename(): return lambda: os.path.realpath(os.path.abspath(__file__)) File2.py ---- import File1 x= File1.get_current_filename() x() 这将使用定义它的文件名,即File1.py

如果以下函数在不同的文件中定义,并在单独的文件中返回和执行,它会给出定义它的文件名吗?或者它的名字在哪里

File1.py
-----
def get_current_filename():
        return lambda: os.path.realpath(os.path.abspath(__file__))

File2.py
----
import File1
x= File1.get_current_filename()
x()

这将使用定义它的文件名,即File1.py

在模块加载过程中,导入系统在每个模块对象上填充_文件_;属性。医生


请注意,这里不支持获取调用模块的文件名File2.py的方法,这只有通过黑客才能实现。避免。

正如wim所说,函数的执行方式是_file _uu将返回函数在File1.py中存在的文件名

然而,实现您想要的目标是可能的,尽管正如wim所说的,这有点不成熟。您可以通过使用以下命令查看调用堆栈中的帧记录来完成此操作:

File1.py:

import inspect

def get_current_filename():
        return inspect.stack()[1][1]
File2.py:

import File1
x = File1.get_current_filename()
print(x)
输出:

C:\<omitted>\File2.py

第一个[1]表示查看调用堆栈中的第二个帧,第一个帧是调用inspect.stack的位置,第二个[1]是调用inspect.stack的位置,第二个[1]从该帧获取文件名。

您可以通过将lambda body更改为print\uu file\uuuuuuuuuuuuuuu来尝试此操作,但这与lambda无关,一个常规的def函数的行为与您所问的基本相同:Python是动态作用域语言还是静态作用域语言?它是后者。在这里使用lambda是不相关的,它不像lisp lambda。lambda是不相关的,Python使用词汇作用域,不支持动态作用域。可能是:?我不认为在某些语言中,Lambda被传递到调用脚本并在调用脚本的上下文中执行是无关紧要的。当您的edi弹出时,Haha正在用调用文件键入如何获取名称。谢谢你的指导,这很吸引人。谢谢你添加这个!使用它!