用法:
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 模块的代码并重新执行 module-level 代码,定义一组新的对象,这些对象绑定到模块字典中的名称。扩展模块的
相关用法
- Python import__用法及代码示例
- Python importlib.reload用法及代码示例
- Python importlib.util.LazyLoader.factory用法及代码示例
- 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大神的英文原创作品 imp.reload。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。