如何重新加载使用 `from module import *` 导入的Python模块
我在这个有用的问答中看到,可以使用reload(whatever_module)
或者在Python 3中使用imp.reload(whatever_module)
来重新加载模块。
我想问的是,如果我用from whatever_module import *
来导入模块,那我就没有whatever_module
这个名字可以用来调用reload()
了。你们会因为我把整个模块放进全局命名空间而骂我吗?:)
8 个回答
7
千万不要使用 import *
;这样会让代码变得难以阅读。
另外,要知道重新加载模块几乎没有什么用。你无法预测在重新加载一个模块后,你的程序会变成什么状态,这样很容易导致一些难以理解、无法重现的错误。
8
一个更简洁的答案是结合了Catskul的好答案和Ohad Cohen对sys.modules
的使用,以及直接重新定义的方式:
import sys
Y = reload(sys.modules["X"]).Y # reload() returns the new module
实际上,执行import X
会创建一个新的符号(X
),这个符号在后面的代码中可能会被重新定义,这样做其实是多余的(而sys
是一个常用的模块,所以这种情况不应该发生)。
这里有个有趣的点是,使用from X import Y
并不会把X
添加到命名空间中,而是把模块X
添加到已知模块的列表中(sys.modules
),这使得可以重新加载这个模块(并访问它的新内容)。
更一般来说,如果需要更新多个导入的符号,那么像这样导入会更方便:
import sys
reload(sys.modules["X"]) # No X symbol created!
from X import Y, Z, T
73
我同意大家的看法,通常情况下“不要这样做”,但是……
正确的答案是:
from importlib import reload
import X
reload(X)
from X import Y # or * for that matter