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
调用它们时