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


Python importlib.reload用法及代码示例


用法:

importlib.reload(module)

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

执行reload() 时:

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

还有许多其他警告:

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

try:
    cache
except NameError:
    cache = {}

重新加载内置或动态加载的模块通常不是很有用。不建议重新加载sys__main__builtins等关键模块。在许多情况下,扩展模块不会被设计为多次初始化,并且在重新加载时可能会以任意方式失败。

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

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

3.4 版中的新函数。

在 3.7 版中更改:ModuleNotFoundError当被重新加载的模块缺少ModuleSpec.

相关用法


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