通过 reload 函数重新加载模块,Python 将以原模块对象属性空间为全局/局部名字空间,再次执行模块代码。这种行为将导致一些诡异的现象,同时也是我们需要注意的地方,我们来看看。
我们在刚刚config.py的同级目录新建一个test.py
-
当我们
删除test模块中的变量a时
,只要a被左边导入过了,那么变量a在左边一直存在,验证如下。
可以看到删除a和没删除a,a变量均存在左边的test模块中正常输出删除变量a之前的值
-
当我们在test.py中变量进行修改时
如果我们一开始导入变量b到左边是下面这种形式导入的
然后我们对
变量b在右边进行修改之后,reload导入查看b的值,结果如下
-
上面的对比已经很明显了,具体为什么会呈现出对应的结果,请自行去研究关于模块加载以及模块代码执行过程。
-
通过 reload 实现热更新,最好通过模块对象引用模块属性,不要直接导入。
-
如果在模块 test 中 import 其他模块,reload 模块 test 时,其他模块不会 reload 。这是要么显式 reload 其他模块,还要特别注意顺序;要么将其他模块路径从 sys.modules 中剔除,之后 Python 将全新加载它。可以将 sys.modules 理解成模块对象运行时缓存,Python 导入一个模块后,将以模块路径为 key ,以模块对象为 value 保存在该字典中。当同一模块被二次 import 时,Python 直接从这取出已加载的模块对象,避免重复加载。因此,当我们将某个模块从 sys.modules 中剔除,Python 将创建新的模块对象并执行模块代码。
在
Python
编程
中
,为了便于维护,通常会把程序拆分为若干个
模块
(Module),在主程序
中
导入(import)这些
模块
。
模块
中
的内容可以是函数和类的定义,也可以是参数值的声明。
模块
中
的语句会且只会在第一次 import 该
模块
的
时
候被执行一次。
在实际项目
中
,有
时
会遇到这种情形:程序
需要
持续保持运行,而我们希望在不
中
断程序的前提下修改一个参数...
Python3
.4 之后,
reload
() 函数移动到 importlib 库,故要
使用
该函数,
需要
先导入importlib包。
加载函数: from importlib import
reload
0.
reload
()函数
重新载入之前载入的
模块
。
1.
使用
方法
>>> from importlib import
reload
>>> help(
reload
)
# output:
Help on fun
Python
2
中
可以直接
使用
reload
(module)重载
模块
。
Pyhton3
中
需要
使用
如下两种方式:
from importlib import
reload
reload
(module)
reload
()函数将以前导入过的
模块
再加载一次。重新加载(
reload
)包括最初导入
模块
时
应用的分析过程和初始化过程。这样就允许在不退出解释器的情况下重新加载已更改的
Python
模块
。
若干
注意
事项:
1. 如果
模块
在语法上是正确的,但在初始化过程
中
失败,则导入过程不能正确地将
模块
的名字绑定到符号表
中
。这
时
,必须在
模块
能被重新加载之前
使用
import()函数加载该
模块
。
2. 重新加载
当我们加载了某个
模块
后,如果该
模块
有变动,那么就
需要
重新加载该
模块
了。
Python
2加载
模块
:
Python
2
中
可以直接
使用
reload
(module)重载
模块
。
Pyhton 3加载
模块
:
>>> import importlib
>>> importlib.
reload
(de_tree)
>>> <module 'part_3....