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

2024-05-15 18:02:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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 *之间的一个区别是,这个hack不能在交互式Python shell中工作。这里,由inspect.stack()[-1][0]获得的帧对象不属于模块,因此inspect.getmodule(inspect.stack()[-1][0])返回None。你知道吗

如何扩展hack,使flood()也能在交互式Python shell中淹没全局名称空间?你知道吗


Tags: 模块函数frompytestimport定义stack