Python 是否可以从导入的模块访问_name _;属性

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

给定一个导入模块B的模块a,模块B中的函数(在模块a中使用)是否有办法从模块a访问
\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__"]}')