懒惰的巨蟒重装者

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第三方库


热门话题
安卓 studio安装的java Unity本机广告   java如何将映射转换为对象   java我试图使用rest控制器从h2数据库中检索记录,但它说没有数据集   反思为什么会抛出java。lang.InstanceException?   在opensuse中找不到Java/javac   java为Android上的谷歌地图添加了5900多个标记。如何有效地做   java如何在if语句中使用循环   java如何在JPA(Hibernate)中映射一对多关系和复合主键?   如何在Java中读取和写入外部进程?   Java线程。睡眠时间最短   java使用EclipseGradle插件如何离线托管和使用依赖项(库jar文件)   java为什么虚拟引用在排队时没有被清除?   java无法理解如何创建用于响铃报警的取消按钮   java解析不应通过注入容器错误发生   java Toast或ProgressDialog不显示   java在自定义对象上使用优先级队列的更好方法   java格式的。wmv文件。(或者任何视频文件都很好)   从页面调用另一个侦听器后,不会调用java JSF<f:ajax>侦听器   java注释ConfigApplicationContext不能多次刷新有什么原因吗?