跳转到主要内容

基于依赖的Python模块重新加载器

项目描述

https://secure.travis-ci.org/jparise/python-reloader.png?branch=master

此库实现了Python的基于依赖的模块重新加载器。与内置的reload()函数不同,此重新加载器将重新加载请求的模块以及依赖于该模块的所有其他模块。

关于重新加载器实现的详细讨论在此处提供

http://www.indelible.org/ink/python-reloading/

使用方法

重新加载器通过跟踪导入的模块之间的依赖关系来工作。它必须首先启用以跟踪这些依赖关系。重新加载器对启用之前或禁用之后导入的模块没有依赖信息,因此您可能希望在应用程序启动过程中尽早启用重新加载器。

import reloader
reloader.enable()

# Import additional modules
import module1
import module2

要手动重新加载导入的模块,将其传递给重新加载器的reload()方法

import example
reloader.reload(example)

请注意,您必须传递模块对象本身,而不是包含模块名称的字符串。如果您只有模块的名称,您可以从全局sys.modules字典中获取模块对象

reloader.reload(sys.modules['example'])

您还可以查询模块的依赖关系,用于信息或调试目的

reloader.get_dependencies(example)

您可以在任何时候禁用重新加载器的依赖关系跟踪

reloader.disable()

黑名单模块

有时您可能不希望重新加载一个模块及其依赖关系层次结构。该模块可能很少更改且导入成本高昂。为了支持这些情况,您可以使用enable()blacklist参数显式地将模块从重新加载过程中“列入黑名单”。

reloader.enable(blacklist=['os', 'ConfigParser'])

黑名单可以是任何可迭代的对象,列出应被忽略的模块的完全限定名称。请注意,列入黑名单的模块将仍然出现在依赖关系图中,以保持完整性;它们只是不会被重新加载。

一个交互式示例

本例演示了如何轻松地从交互式Python解释器中使用reloader。想象一下,你在一个文本编辑器中打开了名为example.py的模块,其中包含以下内容

print "I am example.py"

我们的交互式会话开始如下

>>> import reloader
>>> reloader.enable()
>>> import example
I am example.py

现在,请在您的文本编辑器中修改example.py。然后,您可以在交互式会话中重新加载example

>>> reloader.reload(example)
I am the modified example.py

这是一个简单的示例,它没有完全展示reloader基于依赖的模块跟踪功能,但它希望展示了系统的基本使用和实用性。

__reload__() 回调

如果模块有一个__reload__()函数,则在模块被重新加载后,它将用原始模块字典的副本调用。这提供了一个方便的机制来在重新加载之间保留状态。

考虑一个名为counts的模块,其中包含以下代码

COUNTER = 0

当模块被重新加载时,模块的COUNTER变量将被重置为0

>>> import counts
>>> counts.COUNTER += 1
>>> counts.COUNTER
1
>>> reloader.reload(counts)
>>> counts.COUNTER += 1
1

我们可以通过向counts模块添加一个__reload__()函数来保留COUNTER的值

def __reload__(state):
    global COUNTER
    COUNTER = state['COUNTER']

现在,当我们重新加载counts

>>> import counts
>>> counts.COUNTER += 1
>>> counts.COUNTER
1
>>> reloader.reload(counts)
>>> counts.COUNTER += 1
>>> counts.COUNTER
2

项目详情


下载文件

下载适用于您平台的文件。如果您不确定该选择哪个,请了解更多关于安装包的信息。

源分布

reloader-0.6.tar.gz (5.2 kB 查看散列值)

上传时间

支持者: