自动异步到同步代码转换 —— Psycopg

主要观点:Psycopg 3 提供同步和异步 Python 接口,早期决定提供两者以减少代码重复,内部代码兼容同步和异步,但接口维护困难,手动同步两个变体代码繁琐,于是开发自动转换脚本。
关键信息

  • 提供同步和异步接口,内部代码异步通信,网络代码为生成器。
  • 开发从异步代码生成同步代码的脚本,使用抽象语法树(AST)操作。
  • AST 是代码解析后的内存表示,可通过ast模块处理,ast-comments可处理注释。
  • 利用访问者模式(Visitor Pattern)遍历和转换 AST 树,通过子类化ast.NodeTransformer实现节点特定转换。
  • 处理sleep()等差异时引入_acompat模块,还可使用if True模式处理复杂差异。
  • 转换过程是迭代的,先重构代码使异步和同步模块更相似,再运行转换脚本并添加功能。
    重要细节
  • 示例中从异步async_square函数转换为同步square函数,包括导入模块和修改await等操作。
  • 介绍visit_Awaitvisit_Call方法及结构模式匹配在转换中的应用。
  • 提到不同 Python 版本生成的 AST 不同,可在 Docker 容器中运行脚本。
  • 最终的 Psycopg 3 异步到同步转换脚本具有多种功能,如处理 Mypy 注释等,可并行运行且有检查模式等。
阅读 13
0 条评论