懒惰的巨蟒重装者

lazy-reload的Python项目详细描述


这是一种控制重新加载时发生的情况的方法。模块是 以相同的顺序重新加载 第一次,出于同样的原因,从而消除了 与循环模块引用相关联的不可预测性。

用法

from lazy_reload import lazy_reload
import foo.bar.baz
lazy_reload(foo)
from foo.bar import baz # <= foo, bar, and baz reloaded here

动机

在python中重新加载模块的问题有很多, 众所周知。在正常执行过程中,提及 模块中的对象和模块本身最终 以难以管理的方式分布在对象图周围 很难预测。因此,有旧代码是很常见的 在重新加载后很长一段时间,可能会引用您 估计已经重新装好了。这不一定是python的错:它是 只是一个很难解决的问题。

因此,大多数需要更新代码的应用程序 动态地找到一种方法来为此启动一个新的python进程 目的。如果是 您将节省大量调试方面的麻烦 快跑。对于我们其他人来说,有lazy_reload

python的__builtin__.reload功能

python提供的reload()函数思想非常简单:它 使模块的源文件在 现有模块对象。模块的任何属性 被那个解释覆盖的仍然存在。例如,一个 模块可以检测到它正在重新加载,如下所示:

if 'already_loaded' in globals():
    print 'I am being reloaded'
already_loaded = True

另外,python不尝试更新对该模块的引用 在你计划的其他地方。因为module对象的标识 不会更改,直接的模块引用仍然有效。然而, 对该函数中定义的函数或类的任何现有引用 模块仍将指向旧定义。创建的对象 在重新加载之前,仍然通过 __class__属性,以及任何已导入的本地名称 其他模块仍然引用它们的旧定义。

lazy_reload做什么

lazy_reload(foo)(或lazy_reload('foo'))删除foo和 它的所有子模块来自sys.modules,并安排下一个 当它们中的任何一个被导入时,它们将被重新加载。

什么lazy_reload不起作用

  • 它不会从其他模块中消除对重新加载的模块的引用 模块。特别是,加载后:

    # bar.py
    import foo
    def f():
        return foo.x
    

    foo的引用已经存在于bar中,因此在 lazy_unload(foo),调用bar.f()不会导致foo 即使在那里使用也要重新加载。因此,你是最安全的 在不知道的顶级模块上使用lazy_unload。 按名称列出程序的其他部分。

  • 它不会立即导致任何东西重新加载。记住这一点 重新加载操作是lazy,并且仅当模块 正在导入。

  • 它也不会导致任何东西被“卸载”,也不会 任何可以回收内存的显式操作。如果程序保持 对函数和类的引用,不要期望它们是 垃圾收集。(注意回溯;来自 引发的最后一个异常可以使事情保持比您希望的更长的生存时间)。

  • 它不会叠你的衣服或洗你的猫。如果你不喜欢 这些活动本身,考虑许多负担得起的选择 宠物和衣服。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java在JavaFX TableView中设置行高   java生成范围内的随机数   ProcessBuilder或DefaultExecutor启动的“RunAs”子进程的java读取标准输出   java ExoPlayer播放多个视频   基于匹配器的java Mockito ArgumentCaptor捕获条件   java正在创建更新程序。更新/下载部分   java请求。getAttribute()在servlet中不起作用   java Android Http请求:我不理解以下代码:   java ArrayList Failfast ConcurrentModificationException   if语句Java/LWJGL Pong AI问题   使用Oracle 10g长字段填充Grails域对象时的java空指针   当用户触摸屏时,java按钮不从左上角移动到右下角   未捕获javasocket读取IOException?   用Java绘制一段圆的几何图形?