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

时间:2018-01-19 07:42:41

标签: python python-3.x runtime side-effects dynamic-scope

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

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

from state import set_state
set_state()

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

1 个答案:

答案 0 :(得分:1)

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

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

调用它们的时间