mur*_*own 45 python python-module python-import
我在这个有用的问答中看到了人们可以使用的,reload(whatever_module)或者在Python 3中imp.reload(whatever_module).
我的问题是,如果我说from whatever_module import *要导入怎么办?然后我whatever_module在使用时无需参考reload().你们是否会因为将整个模块投入全局命名空间而对我大喊大叫?:)
Cat*_*kul 50
我同意"一般不做这个"的共识,但......
正确答案是:
import X
reload(X)
from X import Y # or * for that matter
Run Code Online (Sandbox Code Playgroud)
切勿使用import *; 它破坏了可读性.
另外,请注意重新加载模块几乎从不有用.你无法预测你的程序在重新加载模块后最终会处于什么状态,所以这是获得难以理解的,无法解决的错误的好方法.
一个更清晰的答案是 Catskul 的好答案和 Ohad Cohen 的使用和直接重新定义的结合sys.modules:
import sys
Y = reload(sys.modules["X"]).Y # reload() returns the new module
Run Code Online (Sandbox Code Playgroud)
事实上,这样做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
Run Code Online (Sandbox Code Playgroud)