最近把一个老项目迁移到Ruff做代码规范治理,配置规则的时候想看看命名相关规则到底有哪些。我的第一反应是敲出这样一条命令:ruff list --select N。结果命令是跑通了,但我盯着终端愣了几秒——这条命令的语法到底该怎么解析?N是什么玩意?--select和list结合起来为什么就能把规则筛出来了?查官方文档,措辞很克制,没有把匹配逻辑讲透;翻社区帖子,也大多是零散的使用片段。这篇文章就专门来拆解这条命令:语法结构、参数取值逻辑、输出格式、shell转义陷阱,以及我实际配置项目规则时怎么用它走通全流程。
如果你正在给Python项目配置Ruff、从flake8迁移规则,或者看别人配置里写了select = ["N", "E"]却不知道这些字母怎么来的,这篇应该能帮你把链路彻底打通。
1. 先搞清楚“list”和“select”在Ruff里各管什么
1.1 我的第一反应:这到底是SQL的SELECT,还是Shell的select?
第一次看到ruff list --select N,我很自然地想起了SQL里的SELECT语句、Python的select模块、甚至MySQL的select ... from ...。Ruff明明是个代码检查工具,怎么还带个select参数?
其实这里的--select跟SQL半毛钱关系都没有。Ruff把内置的所有lint规则组织成一个规则库,每条规则都有一个唯一代码,比如E501、F401、N801。--select在Ruff里的语义是“从规则库中筛选出你关心的规则子集”,本质上就是一个过滤器。它可以用在ruff check里(真正执行检查时只跑这些规则),也可以用在这里讨论的ruff list里(只罗列出这些规则,不做任何代码分析)。
所以第一步先在心里把概念掰正:这里的select是“规则选择器”,不是数据查询。
1.2 ruff list的定位:一份可筛选的规则清单
ruff list是Ruff提供的一个子命令,作用很单纯:把当前Ruff版本支持的所有lint规则列出来。默认情况下,不带任何参数直接运行ruff list,会输出一张长长的表,里面包含规则代码、规则名、规则说明、所属分类等信息,内容非常多,多到人眼根本看不过来。
这时候--select就派上用场了。它可以在列表阶段就把范围缩小。比如我只关心“命名规范”相关的规则,那就可以用ruff list --select N,让输出里只剩下N开头的那一批。为什么不直接看文档?因为Ruff的规则数量随着版本在涨,新版本会加preview规则,文档不一定跟得上,而且本地命令输出的是当前安装版本的真实规则集合,比查网页靠谱。
1.3 N这个字母不是随口写的:规则代码的编码逻辑
要理解--select N,必须理解Ruff规则代码的编码体系。Ruff把不同来源的规则用前缀字母区分,每个前缀代表一类规则来源或一个插件:
| 前缀 | 规则来源 | 大致方向 |
|---|---|---|
| E | pycodestyle errors | 代码风格错误,如行过长 |
| W | pycodestyle warnings | 代码风格警告,如多余空行 |
| F | Pyflakes | 未使用导入、未定义变量等 |
| N | flake8-naming | 命名规范(PEP 8命名) |
| B | f |
