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

时间:2019-03-05 18:43:00

标签: 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()

2 个答案:

答案 0 :(得分:2)

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

在模块加载期间,导入系统会在每个模块对象上填充__file__属性。文档here

请注意,这里没有获取调用模块文件名(File2.py)的受支持方法,只有黑客才能做到。避免。

答案 1 :(得分:2)

正如wim所说,该函数的执行方式为__file__将返回该函数在(File1.py)中存在的文件的名称。

尽管有如wim所说的那样有点hacky,但是仍然可以实现您想要的。您可以使用inspect.stack通过查看调用堆栈中的帧记录来实现:

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}}从框架中获取文件名。