主要观点:Psycopg 3 提供同步和异步 Python 接口,早期决定提供两者以减少代码重复,内部代码兼容同步和异步,但接口维护困难,手动同步两个变体代码繁琐,于是开发自动转换脚本。
关键信息:
- 提供同步和异步接口,内部代码异步通信,网络代码为生成器。
- 开发从异步代码生成同步代码的脚本,使用抽象语法树(AST)操作。
- AST 是代码解析后的内存表示,可通过
ast
模块处理,ast-comments
可处理注释。 - 利用访问者模式(Visitor Pattern)遍历和转换 AST 树,通过子类化
ast.NodeTransformer
实现节点特定转换。 - 处理
sleep()
等差异时引入_acompat
模块,还可使用if True
模式处理复杂差异。 - 转换过程是迭代的,先重构代码使异步和同步模块更相似,再运行转换脚本并添加功能。
重要细节: - 示例中从异步
async_square
函数转换为同步square
函数,包括导入模块和修改await
等操作。 - 介绍
visit_Await
和visit_Call
方法及结构模式匹配在转换中的应用。 - 提到不同 Python 版本生成的 AST 不同,可在 Docker 容器中运行脚本。
- 最终的 Psycopg 3 异步到同步转换脚本具有多种功能,如处理 Mypy 注释等,可并行运行且有检查模式等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。