用法:
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 模块的代码并重新执行 module-level 代码,定义一组新的对象,这些对象通过重用最初加载模块的加载程序绑定到模块字典中的名称。扩展模块的
相关用法
- Python importlib.util.LazyLoader.factory用法及代码示例
- Python import__用法及代码示例
- Python imp.reload用法及代码示例
- Python OpenCV imdecode()用法及代码示例
- Python imaplib.IMAP4.search用法及代码示例
- Python image转binary用法及代码示例
- Python imaplib.IMAP4用法及代码示例
- Python imaplib.IMAP4.store用法及代码示例
- Python itertools.takewhile用法及代码示例
- Python string isalnum()用法及代码示例
- Python id()用法及代码示例
- Python ipaddress.collapse_addresses用法及代码示例
- Python ipaddress.IPv4Address.reverse_pointer用法及代码示例
- Python io.text_encoding用法及代码示例
- Python string isidentifier()用法及代码示例
- Python numpy irr用法及代码示例
- Python ipaddress.IPv4Address.__format__用法及代码示例
- Python calendar isleap()用法及代码示例
- Python itertools.compress用法及代码示例
- Python math isclose()用法及代码示例
注:本文由纯净天空筛选整理自python.org大神的英文原创作品 importlib.reload。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。