添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

与 Python 2 不同,reload 在最新的 Python 中不再作为内建函数存在了,而被移入标准库 importlib 模块中。

实验1,reload基本使用

  1. 假设我们有个模块叫做config.py
    在这里插入图片描述

  2. 导入一下config模块(如果导入报错找不到config模块,请配置模块的搜索路径先再来测试如下的步骤),如下
    在这里插入图片描述

  3. 我们在右边终端修改b变量的值为20保存退出,再次导入(这个时候我们退出左边的交互式环境),可以看到b的值并没有发生变化,那有没有不退出左边的交互式环境,热加载呢
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/d271ff5f9ff947caac4f6341b9305c4d.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAbGl5dWFuY2hhb19ibG9n,size_16,color_FFFFFF,t_70,g_se,x_16

  4. 有的,这个时候reload就派上用场了,可以看到reload实现了在不退出左边交互式环境的情况下实现了重新加载到了config模块中b最新的值
    在这里插入图片描述

实验二,reload的局限性

通过 reload 函数重新加载模块,Python 将以原模块对象属性空间为全局/局部名字空间,再次执行模块代码。这种行为将导致一些诡异的现象,同时也是我们需要注意的地方,我们来看看。

我们在刚刚config.py的同级目录新建一个test.py

  1. 当我们 删除test模块中的变量a时 ,只要a被左边导入过了,那么变量a在左边一直存在,验证如下。

    可以看到删除a和没删除a,a变量均存在左边的test模块中正常输出删除变量a之前的值
    在这里插入图片描述

  2. 当我们在test.py中变量进行修改时
    如果我们一开始导入变量b到左边是下面这种形式导入的
    在这里插入图片描述

然后我们对 变量b在右边进行修改之后,reload导入查看b的值,结果如下
在这里插入图片描述

  1. 上面的对比已经很明显了,具体为什么会呈现出对应的结果,请自行去研究关于模块加载以及模块代码执行过程。
  2. 通过 reload 实现热更新,最好通过模块对象引用模块属性,不要直接导入。
  3. 如果在模块 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....