来自pydev的增强的重新加载模块
pydevd-reload的Python项目详细描述
这是一个基于https://github.com/fabioz/PyDev.Debugger中pydevd_reload.py的重新加载库。原始库在pydev&pycharm中使用。
安装
如果时间不多,只需执行
$ pip install pydevd_reload
它将在您的系统上安装模块(无需测试)。
另外,您可以复制并粘贴不需要第三方依赖的pydevd_reload.py。
用法
只需导入pydevd_reload并使用pydevd_reload.xreload作为重新加载内置函数。
importpydevd_reloadpydevd_reload.xreload(module_instance)
默认情况下更新代码
运行的python程序由代码逻辑和相应的数据组成。代码逻辑是程序执行的逻辑。相应的数据是逻辑运行的环境。
- 程序可以包含模块、类和函数。
- 模块可以包含类和函数。
- 类可以包含函数。
所以,函数是程序的基本逻辑结构。代码逻辑隐藏在高级函数对象中,重载是基于替换函数对象的代码对象。运行环境可能会改变,这意味着操作与逻辑相关的数据可能是危险的,因此pydevd_reload提供了允许按需更新数据的自定义挂钩。
- pydevd_reload不会从新类重新创建旧命名空间。相反,它保留了现有的命名空间,加载了它的新版本,只更新了PyDeDyReLoad可以替换的一些东西。这样,pydevd_reload就不会破坏诸如singleton之类的东西,也不会在内存中使用同一个类的第二个表示。
- 如果pydevd_reload发现它是一个uu元类,那么尝试将其更新为一个常规类。
- Pydevd_reload不会移除旧属性(即使它们不再使用,也会让它们四处散落)。
- 重新加载挂钩已更改
这些更改使其更加稳定,特别是在常见情况下(在调试会话中,只有 除了为要扩展的用户提供灵活性之外,还更改了函数的内容。 在上面。
通过自定义钩子更新数据
pydevd_reload默认情况下在模块中重新加载代码对象,并提供__xreload_old_new__和__xreload_after_reload_update__自定义挂钩,允许用户更新模块中的数据。钩子函数也可以在重新加载时进行热更新。
参与某些属性的更改:
In a module:
__xreload_old_new__(namespace,name,old,new):pass
in a class:
@classmethoddef__xreload_old_new__(cls,name,old,new):pass
A class or module may include a method called ‘__xreload_old_new__’ which is called when pydevd_reload is unable to reload a given attribute.
在整个重新加载完成后执行操作:
In a module:
def__xreload_after_reload_update__(old_namespace,new_namespace):pass
In a class:
@classmethoddef__xreload_after_reload_update__(cls,old_namespace,new_namespace):pass
A class or module may include a method called ‘__xreload_after_reload_update__’ which is called after the reload finishes.
重要提示:提供钩子时,请始终使用提供的名称空间或cls,而不要使用全局中的任何内容 命名空间,因为全局命名空间仅在重新加载期间临时创建,可能不会反映 实际应用程序状态(传递的CLS和命名空间为)。
改进
这个独立的pydevd_reload库比原来的pydevd_reload.py有以下改进:
- 已删除Pydevd依赖项。
- 删除了无法处理具有装饰器的函数的限制。*
- 添加了对更新函数闭包的支持。*
- 添加了对更新可调用对象的支持。*
- 添加了对更新函数注释的支持。
- 添加了代码对象名称检查以避免更新猴子修补的代码。*
- 精致的重新装载挂钩。(例如,uxreload_u old_u new_u和uxreload_u after_u reload_u update)
- 修复了命名空间中的“文件”属性,以便更新它们。
- 修复了编译后的python文件支持。
- 修复了从不同路径编译python代码时重新加载失败的问题。
限制
- 属性/常量被添加,但没有更改(因此singleton和应用程序状态不是 断开-使用提供的挂钩解决)。
- 使用元类的代码可能并不总是有效的。
- 重命名处理不正确。
- 依赖模块是n没有重新装载。
测试
如果您有源代码,则可以使用
$ python pydevd_reload/tests/test_pydevd_reload.py