首页 > 解决方案 > 可以从导入的模块访问 __name__ 属性吗

问题描述

给定一个导入模块 B 的模块 A,模块 B 中的函数(在模块 A 中使用)是否有办法访问模块 A 中的__name__属性,而无需显式传递(例如,函数参数)?

标签: pythonimportmoduleattributes

解决方案


是的,您可以通过一级函数调用堆栈“返回”来访问存储在框架f_globals属性中的调用函数的全局变量。这就是我的意思:

# The main script.

import module_A

module_A.func()

# 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__"]}')

运行主脚本的输出:

module_B.func() was called from module_A

我想补充一点,这是一件很老套的事情,所以在生产代码中做之前你可能要三思而后行。


推荐阅读