Python:重新实现`from module import *`

时间:2017-12-17 19:27:10

标签: python python-3.x import module callstack

我有这个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中泛洪全局命名空间?

0 个答案:

没有答案