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

Get reference to a namespace where the function was called

Python 3 中是否有通用方法来获取对调用函数的模块名称空间的引用?问题源于这样一个事实,即函数中的 global 引用了定义函数的名称空间,但我想像在具有动态范围的语言中那样获取对调用它的名称空间的引用。

实际上,我想在交互式会话期间用预定义的值污染当前命名空间,类似于 from module import * 但调用 set_state().

from state import set_state
set_state()

from module import * 语法是不够的,因为我有几个像 set_state(3) 一样访问的配置。我知道我可以将 locals() 作为参数传递给函数。尽管如此,我认为存在更通用的解决方案。此外,答案不应仅限于当前用例。

是的,您可以使用检查模块,例如:

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] + '()' )  

您现在可以从另一个模块 import test 调用函数。

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()

前两行是在 import 期间,最后两行是当您从 test2.py

调用它们时