Python 是否可以从导入的模块访问_name _;属性
给定一个导入模块B的模块a,模块B中的函数(在模块a中使用)是否有办法从模块a访问Python 是否可以从导入的模块访问_name _;属性,python,import,module,attributes,Python,Import,Module,Attributes,给定一个导入模块B的模块a,模块B中的函数(在模块a中使用)是否有办法从模块a访问\uuu name\uuuu属性,而不显式传递它(例如,作为函数参数)?如果从模块a调用,您可以返回堆栈帧并获取调用B模块函数的函数的文件名。下面是遍历堆栈的一些示例代码 import inspect def recurse(limit): local_variable = '.' * limit if limit <= 0: for frame, filename, lin
\uuu name\uuuu
属性,而不显式传递它(例如,作为函数参数)?如果从模块a调用,您可以返回堆栈帧并获取调用B模块函数的函数的文件名。下面是遍历堆栈的一些示例代码
import inspect
def recurse(limit):
local_variable = '.' * limit
if limit <= 0:
for frame, filename, line_num, func, source_code, source_index in inspect.stack():
print '%s[%d]\n -> %s' % (filename, line_num, source_code[source_index].strip())
print inspect.getargvalues(frame)
print
return
recurse(limit - 1)
return
if __name__ == '__main__':
recurse(3)
导入检查
def递归(限制):
局部变量='.'*极限
如果limitYes,您可以通过函数调用堆栈一级“返回”来访问存储在帧的f_globals
属性中的调用函数的全局。
我的意思是:
# The main script.
import module_A
module_A.func()
运行主脚本的输出:
module_B.func()是从module_A调用的
我想补充一点,这是一种黑客行为,所以在生产代码中使用它之前,您可能需要三思而后行。仅当它首先引用了a
,我不认为它是隐式可用的,因为Python是词汇范围的。不需要提及它…从字面上看。观察:从2020-01-01开始生效,不会对Python2()进行新的错误报告、修复或更改,因此我建议您尽快迁移到Python3.x。
# module_A.py
import module_B
def func():
module_B.func()
# module_B.py
import sys
def func():
namespace = sys._getframe(1).f_globals # caller's globals
print(f'module_B.func() was called from {namespace["__name__"]}')