平常摸鱼看了不少团队无法统一代码风格团 or 自己提了方案没人执行 or 每次 review 都要强调某些规则。搜索了下还是有现成的解决方案的,比如自己写 pylint 的插件。
在写插件过程中,感觉 ast 树和 pylint 的插件 demo 都不是很好理解。于是自己整合了一下,能让即使不懂 ast 和 pylint 的原理也能开发插件,examples 里就可以看见简单的使用方法。
地址:github
from flint import Rule
from flint import Msg
rule = Rule(name="orm_rule", priority=-1)
msg = Msg()
msg.add_msg(error_code="W0011", display="raw_sql 函数不可以随处调用", symbol="raw_sql_cant_use")
msg.add_msg(error_code="W0012", display="sql 拼接不可以使用 format 函数", symbol="sql_cant_use_format")
rule.bind_msg(msg)
@rule.bind_def()
def visit_call(self, node):
path = self.current_file
if "examples/code" in path and "raw_sql" in node.as_string():
self.add_message(
'raw_sql_cant_use', node=node
)
简单的定义个函数,写一点规则。就能防止像示例代码中写的一样在 view 层直接调用数据库。根据 ast 的原理,基本所有你想定义的规范都可以实现。花个一小时,就能搞一套公司通用的规范。跟 ci 和 pre-commit 一结合,强制减少 review 工作量和代码不规范的情况。
觉得有用的老哥可以顺手点个 star 呗
1
triangle111 2020-05-13 20:53:37 +08:00
python 也有 ast, 我一直以为 ast 是 js 才有的。。。
|
2
Nostalgiaaaa OP @triangle111
大部分语言都有,理论上都可以做类似的代码规范检查 |
3
no1xsyzy 2020-05-15 13:37:54 +08:00
@triangle111 #1 直接把讨论 lowB 化了还行……
AST 就是个 PL 的概念,除了超一维的语言和花指令写不出 AST 以外,哪个语言没有 AST ? Lisp 都被人吐槽 “不就是手撸 AST” |
4
Nostalgiaaaa OP @no1xsyzy 这个不知道还是挺正常的,大学我记得也没专门介绍过这个东西。本科教材还是差点意思。
|
5
no1xsyzy 2020-05-15 18:27:04 +08:00
@Nostalgiaaaa #4 我跑题了……
我主要是觉得:知道 AST 是什么,却不知道 AST 是个超脱于特定语言的概念挺神奇的。 |