如何让Python模块访问导入它的环境中的全局变量?
如何让函数返回调用者的全局变量而非定义模块的全局变量?
问题出在globals()的行为上:它返回的是定义该函数的模块的全局命名空间,而不是调用函数时所在的命名空间。你的bar函数在foo模块里定义,所以bar()返回的是foo模块的全局变量,里面的x就是初始赋值的0,和终端里主模块(__main__)定义的x=1完全是两个不同的变量。
要实现你要的效果,也就是让bar返回调用者的全局变量,可以用Python的inspect模块获取调用栈的上下文:
修改foo.py如下:
import inspect x = 0 def bar(): # 获取调用bar的上层帧,取出其全局命名空间 caller_frame = inspect.currentframe().f_back return caller_frame.f_globals
之后在终端执行你的代码:
from foo import bar x=1 bar()["x"] # 此时返回1,符合预期
补充说明
inspect.currentframe()会获取当前bar函数执行时的栈帧,f_back属性指向调用bar的那个栈帧(也就是终端里的代码上下文)- 每个栈帧的
f_globals属性就是该上下文的全局命名空间字典
如果你想保留灵活性,也可以让调用者手动传入全局命名空间(可选):
# foo.py import inspect x = 0 def bar(caller_globals=None): if caller_globals is None: caller_frame = inspect.currentframe().f_back caller_globals = caller_frame.f_globals return caller_globals
这样调用时既可以用bar()自动获取,也可以手动传bar(globals()),效果一致。
内容的提问来源于stack exchange,提问作者Thomas Winckelman
相关产品推荐
相关产品推荐

