如何重新加载使用`从模块导入*`导入的Python模块

我在这个有用的问答中看到,可以使用reload(whatever_module)或者在Python 3中使用imp.reload(whatever_module)

我的问题是,如果我from whatever_module import *中导入了什么呢? 然后,我没有whatever_module来引用当我使用reload() 。 你们会因为把整个模块扔到全局命名空间而嚷嚷吗? 🙂

我同意“一般不这样做”的共识,但…

正确的答案是:

 import X reload( X ) from X import Y # or * for that matter 

切勿使用import * ; 它破坏了可读性。

另外,请注意,重新加载模块几乎是没有用的。 你不能预测你的程序在重新加载模块之后会以什么状态出现,所以这是一个很好的方法来获得难以理解的,不可再生的错误。

一个

 from module import * 

module获取所有“导出”对象,并将它们绑定到模块级别(或任何范围内的级别)名称。 您可以重新加载模块:

 reload(sys.modules['module']) 

但是这对你没有任何好处:无论你的范围是什么级别的名字仍然指向旧的对象。

from whatever_module import whatever使用from whatever_module import whateverwhatever是作为导入模块的一部分计算,所以要重新加载它 – 你应该重新加载你的模块。 但是重新加载你的模块,你仍然会得到旧的whatever – 从已经导入的whatever_module ,所以你需要重新加载(whatever_module),并重新加载你的模块:

 # reload(whatever_module), if you imported it reload(sys.modules['whatever_module']) reload(sys.modules[__name__]) 

如果你使用from whatever_module import whatever你也可以考虑

 whatever=reload(sys.modules['whatever_module']).whatever 

要么

 whatever=reload(whatever_module).whatever 
 import re for mod in sys.modules.values(): if re.search('name', str(mod)): reload(mod)