Python 获取对调用函数的命名空间的引用

Python 获取对调用函数的命名空间的引用,python,python-3.x,runtime,side-effects,dynamic-scope,Python,Python 3.x,Runtime,Side Effects,Dynamic Scope,在Python3中,是否有一种通用的方法来获取对调用函数的模块名称空间的引用?问题产生于函数中的global引用了定义函数的名称空间,但我希望获得对名称空间的引用,在名称空间中调用它,就像在具有动态范围的语言中一样 实际上,我希望在交互式会话期间使用预定义的值污染当前名称空间,类似于模块导入中的*,但调用set\u state() 模块导入的*语法是不够的,因为我有几个可以访问的配置,比如set\u state(3)。我知道我可以将locals()作为参数传递给函数。然而,我认为存在一个更普遍的

在Python3中,是否有一种通用的方法来获取对调用函数的模块名称空间的引用?问题产生于函数中的
global
引用了定义函数的名称空间,但我希望获得对名称空间的引用,在名称空间中调用它,就像在具有动态范围的语言中一样

实际上,我希望在交互式会话期间使用预定义的值污染当前名称空间,类似于模块导入中的
*
,但调用
set\u state()


模块导入的
*
语法是不够的,因为我有几个可以访问的配置,比如
set\u state(3)
。我知道我可以将
locals()
作为参数传递给函数。然而,我认为存在一个更普遍的解决办法。此外,答案不应局限于当前用例。

是,您可以使用inspect模块,例如:

test.py

import os
import sys
import inspect

def my_function():
    print ('Module/Function : ' + os.path.basename(__file__) + ' ' + sys._getframe().f_code.co_name +'()') 
    print ('Called from     : ' + os.path.basename(inspect.stack()[1][1]) +' ' + inspect.stack()[1][3] + '()' )  
现在,您可以从另一个模块导入测试,并调用该函数

test2.py

import test

def my_test_function():
    test.my_function()

my_test_function()
输出:

Module/Function : test.py my_function()
Called from     : test.py <module>()
Module/Function : test.py my_function()
Called from     : test2.py my_test_function()
模块/函数:test.py my_函数()
调用自:test.py()
模块/函数:test.py my_Function()
调用自:test2.py my_test_function()

前两行是在
导入期间
,最后两行是从
test2.py

调用它们时,我想您需要的是
inspect.currentframe().f_back.f_globals
。不要忘记先导入检查
sys.\u getframe(1)
。虽然它的文档串有点不祥。
Module/Function : test.py my_function()
Called from     : test.py <module>()
Module/Function : test.py my_function()
Called from     : test2.py my_test_function()