基于依赖关系的python模块重载器
reloader的Python项目详细描述
这个库为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()
黑名单模块
有时可能不需要模块及其依赖关系层次结构 被重新装载。该模块可能很少更改,而且导入成本很高。 为了支持这些情况,您可以从 使用blacklist参数将进程重新加载到enable()。
reloader.enable(blacklist=['os', 'ConfigParser'])
黑名单可以是任何列出模块完全限定名的列表。 这应该被忽略。注意,黑名单模块仍将出现在 依赖关系图的完整性;它们不会被重新加载。
交互式示例
这个例子演示了从 交互式python解释程序。假设您拥有模块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__()函数,它将使用 重新加载后的原始模块字典。这提供了 在重新加载之间保持状态的方便机制。
考虑一个名为counts的模块,它包含以下代码:
COUNTER = 0
当模块是 重新加载:
>>> import counts >>> counts.COUNTER += 1 >>> counts.COUNTER 1 >>> reloader.reload(counts) >>> counts.COUNTER += 1 1
我们可以通过添加 __reload__()函数到counts模块:
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