我有这个flood
函数,该函数使用与flood
相同的模块中定义的所有全局变量来泛滥调用者的名称空间:
# test.py
import inspect
a, b, c = 0, 1, 2
def flood():
inspect.getmodule(inspect.stack()[-1][0]).__dict__.update(globals())
从其他模块调用时,例如
# main.py
import test
test.flood()
print(a, b, c)
调用test.flood()
等同于执行from test import *
。将此功能包含在函数中时,在使用Cython时会派上用场,其中 - 如果已编译test.py
,则from test import *
不会导入在C级声明的变量。
这个hack和正确的from test import *
之间的一个区别是黑客无法在交互式Python shell中运行。这里,inspect.stack()[-1][0]
获得的框架对象不属于某个模块,因此inspect.getmodule(inspect.stack()[-1][0])
会返回None
。
如何扩展hack以便flood()
也可以在交互式Python shell中泛洪全局命名空间?