作为一个优秀的开源项目,飞桨汇聚了大批开发者与贡献者。像很多大型开源项目,飞桨框架一直很注重代码的规范性,并且随着代码仓库的演进持续加强。之前也有尝试过参与一些相关的优化,但如此庞大的一个Codebase并不是说随便改改就好的。所以,便有了本项「计划」:在开发工具链中增加规范检查和优化,让飞桨框架的代码更优雅,开发体验更好。
Formatter
Linter
Linter主要用于给开发者提示代码中存在的格式问题、语法问题和一些潜在的逻辑问题。与Formatter不一样的是,Linter往往是不进行自动修复的,最多只会给出一个修改建议,提示开发者手动对问题进行修复。由于Linter会给出一些潜在的逻辑问题,对于这些问题也只能手动修复。当然,Linter相比于Formatter所拥有最大的价值也在于提示这些逻辑问题。目前常见的Linter工具主要包含了Flake8、Pylint等,此外还有些静态类型检查工具,比如Mypy、Pytype、Pyright等。
最后就是CI,作为整个工作流的最后一步,CI往往有最完整的代码检查,这样即便开发者本地编辑器没有进行相关配置,或者本地没有安装pre-commit,在这一步都能够检查出来,保证合并到主线上的代码是没有相关问题的。
对于简单的代码格式修复,可以采用文本/正则搜索和替换。比如我之前为飞桨Paddle/docs项目做的自动在中英文间加空格(insert-whitespace-between-cn-and-en-char)就是使用正则实现的。但如果有更加复杂的需求,可能就需要手写一些复杂的规则进行处理了,一般情况下这种需求并不多,而且大多数文本都是有一定的语法规则的,这些拥有语法规则的文本直接在抽象语法树AST(Abstract Syntax Tree)上处理是更好的方式。这里拿之前我在进行单测报错信息优化时的一个简单的例子来说明一下AST的结构。
首先说明当时的一个需求,来源于GitHub上Paddle repo下的一个Issue:
self.assertTrue(
np.allclose(
res[0],
feed_add,
rtol=1e-5),
msg='blabla((((()()((xxxdfdf(')
利用AST的工具不在少数,Formatter自不必说,Linter也有很大一部分是在AST上进行语法结构匹配和分析的。
欢迎大家加入我们,一起建设更优雅的飞桨框架~
在这里,与我们一起定义飞桨框架的未来!
本文作者
相关链接
作者博客
https://nyakku.moe/posts/2022/09/21/moefy-paddle-dx-improvements.html
Call for Contributions
https://github.com/PaddlePaddle/community/tree/master/pfcc/call-for-contributions
https://github.com/PaddlePaddle/community/blob/master/pfcc/2022-09-08-meeting-minutes.md
推荐阅读
关注【飞桨PaddlePaddle】公众号
获取更多技术内容~
作为一个优秀的开源项目,飞桨汇聚了大批开发者与贡献者。像很多大型开源项目,飞桨框架一直很注重代码的规范性,并且随着代码仓库的演进持续加强。之前也有尝试过参与一些相关的优化,但如此庞大的一个Codebase并不是说随便改改就好的。所以,便有了本项「计划」:在开发工具链中增加规范检查和优化,让飞桨框架的代码更优雅,开发体验更好。
Formatter
Linter
Linter主要用于给开发者提示代码中存在的格式问题、语法问题和一些潜在的逻辑问题。与Formatter不一样的是,Linter往往是不进行自动修复的,最多只会给出一个修改建议,提示开发者手动对问题进行修复。由于Linter会给出一些潜在的逻辑问题,对于这些问题也只能手动修复。当然,Linter相比于Formatter所拥有最大的价值也在于提示这些逻辑问题。目前常见的Linter工具主要包含了Flake8、Pylint等,此外还有些静态类型检查工具,比如Mypy、Pytype、Pyright等。
最后就是CI,作为整个工作流的最后一步,CI往往有最完整的代码检查,这样即便开发者本地编辑器没有进行相关配置,或者本地没有安装pre-commit,在这一步都能够检查出来,保证合并到主线上的代码是没有相关问题的。
对于简单的代码格式修复,可以采用文本/正则搜索和替换。比如我之前为飞桨Paddle/docs项目做的自动在中英文间加空格(insert-whitespace-between-cn-and-en-char)就是使用正则实现的。但如果有更加复杂的需求,可能就需要手写一些复杂的规则进行处理了,一般情况下这种需求并不多,而且大多数文本都是有一定的语法规则的,这些拥有语法规则的文本直接在抽象语法树AST(Abstract Syntax Tree)上处理是更好的方式。这里拿之前我在进行单测报错信息优化时的一个简单的例子来说明一下AST的结构。
首先说明当时的一个需求,来源于GitHub上Paddle repo下的一个Issue:
self.assertTrue(
np.allclose(
res[0],
feed_add,
rtol=1e-5),
msg='blabla((((()()((xxxdfdf(')
利用AST的工具不在少数,Formatter自不必说,Linter也有很大一部分是在AST上进行语法结构匹配和分析的。
欢迎大家加入我们,一起建设更优雅的飞桨框架~
在这里,与我们一起定义飞桨框架的未来!
本文作者
相关链接
作者博客
https://nyakku.moe/posts/2022/09/21/moefy-paddle-dx-improvements.html
Call for Contributions
https://github.com/PaddlePaddle/community/tree/master/pfcc/call-for-contributions
https://github.com/PaddlePaddle/community/blob/master/pfcc/2022-09-08-meeting-minutes.md
推荐阅读
关注【飞桨PaddlePaddle】公众号
获取更多技术内容~