来自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提供了允许按需更新数据的自定义挂钩。

  1. pydevd_reload不会从新类重新创建旧命名空间。相反,它保留了现有的命名空间,加载了它的新版本,只更新了PyDeDyReLoad可以替换的一些东西。这样,pydevd_reload就不会破坏诸如singleton之类的东西,也不会在内存中使用同一个类的第二个表示。
  2. 如果pydevd_reload发现它是一个uu元类,那么尝试将其更新为一个常规类。
  3. Pydevd_reload不会移除旧属性(即使它们不再使用,也会让它们四处散落)。
  4. 重新加载挂钩已更改

这些更改使其更加稳定,特别是在常见情况下(在调试会话中,只有 除了为要扩展的用户提供灵活性之外,还更改了函数的内容。 在上面。

通过自定义钩子更新数据

pydevd_reload默认情况下在模块中重新加载代码对象,并提供__xreload_old_new____xreload_after_reload_update__自定义挂钩,允许用户更新模块中的数据。钩子函数也可以在重新加载时进行热更新。

  1. 参与某些属性的更改:

    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.

  2. 在整个重新加载完成后执行操作:

    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没有重新装载。
  • 新的SysSts*不能添加到现有的类中。

测试

如果您有源代码,则可以使用

$ python pydevd_reload/tests/test_pydevd_reload.py

存储库

该项目托管在github上。您可以在此处查看源代码:

https://github.com/fyrestone/pydevd_reload

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

推荐PyPI第三方库


热门话题
面向java语句的方法与面向表达式的方法   密码学如何在java中为json对象签名?   是否可以通过java程序知道给定卡夫卡消费群体的消费偏移量?   打印字符时出现java未知问号   java为JFrame设置背景色   在ubuntu中检查java版本时linux权限被拒绝   如何用java创建xml模式   java无法在远程服务器上运行Vaadin应用程序   java智能垃圾收集?   java如何在SpringMVC中设置缓存头?   在unix计算机上运行java应用程序a:>签名以输入内容   Java、Apache Commons配置XML属性   使用ArrayList调用Java未经检查的方法   在文本文件中查找并替换单词(Java GUI)   java Android Studio无法检测到JDK7或更新版本   java从socket的有效负载获取事件消息   安卓中java调用子类方法   java如何通过点击超链接来运行jar文件(Firefox)