当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python imp.reload用法及代码示例


用法:

imp.reload(module)

重新加载以前导入的 module 。参数必须是一个模块对象,所以它必须之前已经成功导入。如果您使用外部编辑器编辑了模块源文件并且想要在不离开 Python 解释器的情况下试用新版本,这将非常有用。返回值是模块对象(与module 参数相同)。

reload(module) 执行时:

  • 重新编译 Python 模块的代码并重新执行 module-level 代码,定义一组新的对象,这些对象绑定到模块字典中的名称。扩展模块的init函数不会被第二次调用。
  • 与 Python 中的所有其他对象一样,旧对象仅在其引用计数降至零后才会被回收。
  • 模块命名空间中的名称被更新以指向任何新的或更改的对象。
  • 对旧对象的其他引用(例如模块外部的名称)不会重新引用以引用新对象,并且如果需要,必须在它们出现的每个命名空间中进行更新。

还有许多其他警告:

重新加载模块时,会保留其字典(包含模块的全局变量)。重新定义名称将覆盖旧定义,因此这通常不是问题。如果模块的新版本没有定义旧版本定义的名称,则旧定义仍然存在。如果模块维护一个全局表或对象缓存,则此函数可用于模块的优势 - 使用 try 语句,它可以测试表的存在并在需要时跳过其初始化:

try:
    cache
except NameError:
    cache = {}

除了 sys__main__builtins 之外,重新加载内置或动态加载的模块通常不是很有用,但这是合法的。然而,在许多情况下,扩展模块不会被设计为多次初始化,并且在重新加载时可能会以任意方式失败。

如果一个模块使用 from ... import ... 从另一个模块导入对象,则为另一个模块调用 reload() 不会重新定义从它导入的对象 — 解决此问题的一种方法是重新执行 from 语句,另一种方法是使用 import 和限定名称 (module .*name*)。

如果一个模块实例化了一个类的实例,重新加载定义该类的模块不会影响实例的方法定义——它们会继续使用旧的类定义。派生类也是如此。

在 3.3 版中更改:两者都依赖__name____loader__在重新加载的模块上定义,而不仅仅是__name__.

自 3.4 版起已弃用:采用importlib.reload反而。

相关用法


注:本文由纯净天空筛选整理自python.org大神的英文原创作品 imp.reload。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。