☰
Pylint与Flake8:Python静态检查双工具对比与配置实战
2026/10/6 13:24:41 网站建设 项目流程

写代码这件事,写完能跑只是第一步,代码能长期被维护、被别人接手不骂人,才是真正见功夫的地方。今天我专门聊聊Python生态里两个最常用的静态检查工具——Pylint和Flake8。它们常被放在一起称呼,动不动就出现在各种项目的CI脚本里,但很多人其实没搞明白:这俩到底有什么区别?是不是装一个就够了?为什么有的团队两个都上了?我平时收到最多的私信就是“配了一堆规则,结果检查出来全是队友的报错,怎么调?”或者是“Flake8明明过了,代码还是被Code Review打回来了,那Flake8到底管了啥?”这篇文章我会把这俩工具从理念、规则、配置、到接进项目的完整流程都过一遍,再把我踩过的一些坑和排查套路分享出来,希望对你有实在的参考价值。

1. 整体思路拆解:为什么“双卫士”而不是“二选一”

1.1 两把尺子量的是不同的东西

我习惯把Pylint和Flake8比作两种尺子:Flake8是一把皮尺,刻度粗,量的是“你是不是一块长得规矩的布料”;Pylint则更像游标卡尺,精度高,量的是“你的线脚是否均匀、针距是否符合定制标准”。

具体来说,Flake8本质上是三个老牌工具的组合体:PyFlakes负责检查逻辑错误(比如导入了却没用的变量、定义未使用的变量)、pycodestyle负责检查代码风格是否符合PEP 8、McCabe负责计算圈复杂度。它的特点非常鲜明:快、准、轻。默认规则少而精,几乎不会出现“同一个文件里互相矛盾的提示”,很适合作为第一道关卡。

Pylint则完全不同,它内置的检查项超过一百个,覆盖面极广:命名风格、代码重复、可读性、设计层面的坏味道(比如参数过多、方法过于复杂)、甚至潜在bug模式都能提示。它还对每个提示给出了从0星到10星的评分体系,最终会给你整个项目打一个代码评分。这就意味着Pylint的“主观判断”成分比Flake8高得多。

这个差异用一个实际例子就能看出来。你在文件里写了一个空函数:

def process_data(data): pass

Flake8只会提示一个E301或者什么都不提示(取决于你是否启用相关规则),因为它只关心空行、缩进、未使用变量。而Pylint会报W0104(代码块内出现未使用的赋值)、R1711(函数体内只有pass,可改用省略号)、甚至会给出C0116这个缺少docstring的警告。同样是这段代码,两把尺子量出来的“瑕疵”数量完全不同。

1.2 先量版型,再量针脚:推荐的双工具工作流

在我参与过的项目里,最省心的组合是:提交代码之前先用Flake8做初步清洗,提交或者进CI之后再用Pylint做深度体检。为什么是这个顺序?因为Flake8跑得快,平均每秒钟能处理上千个文件,适合在本地每次保存、提交的时候快速反馈;而Pylint因为有复杂的类型推断和交叉引用分析(比如它需要分析模块之间的import关系),跑起来相对慢,适合放到CI或者pre-push阶段执行。

举个例子,一个中等规模的项目(大约200个Python文件),Flake8全量检查耗时大概是2到3秒,Pylint大约需要15到20秒。如果没有高对比度反馈,本地开发时每次跑Pylint会非常难受;而如果只跑Flake8,很多真正的“坏味道”又检查不出来。

所以我的推荐是:

检查阶段工具选择用途
编辑器保存时Flake8快速处理语法错误、未使用导入、PEP 8风格问题
Git提交前(pre-commit)Flake8阻止明显低质量代码进入版本库
CI流水线(MR/PR阶段)Pylint全面体检,输出评分报告
版本发布前Pylint + 自定义规则深度检查设计问题和潜在隐患

1.3 团队落地时最容易忽略的“人”的因素

说句实在话,这两个工具在技术层面的难度并不高,真正难的是怎么让一个团队愿意接受检查结果。我见得太多了:Pylint一接入,配置文件里塞了几十行disable,最后等于摆设。为什么会这样?因为Pylint默认规则太严格,新人交上来的代码几乎必然触发一堆警告,被CI卡住之后,大家不是去改代码,而是先去改配置文件,把那条规则给禁掉。等禁到一定数量,Pylint就从一个质量工具变成了一件“皇帝的新衣”。

我的经验是先定“红线规则”:哪些必须报错、哪些只警告、哪些可忽略,这个划分不是随便来的,而是基于业务场景和团队能力慢慢调整的。比如纯算法模块里,我对missing-docstring睁一只眼闭一只眼;但如果是一套对外暴露的API接口函数,就强制要求docstring,因为这是接口契约的一部分。

2. 核心细节解析:Pylint与Flake8的关键配置和实操要点

2.1 安装与依赖关系:别把版本装“花”了

这两个工具安装本身不复杂,但有几个细节值得注意。先看基础安装:

pip install flake8 pylint

如果你用的是较新的Python版本(3.10以上),直接这样装基本没问题。但如果是老项目,比如还在Python 3.7或者3.8的环境里,我建议先看看Flake8的历史版本兼容列表,这个工具对Python版本非常敏感。Flake8 4.0以上版本不再支持Python 3.6以下的解释器;而Pylint 2.13以上要求Python 3.7才能跑。所以碰到老环境,最好按以下方式指定:

pip install "flake8>=3.5,<5.0" "pylint>=2.5,<3.0"

另外一个极容易踩坑的是依赖冲突。Flake8依赖pycodestyle、pyflakes、mccabe这三个库,它实例化的时候会对版本有隐式要求,你手动装了一个不同版本的pycodestyle,就会看到一堆匪夷所思的报错(比如提示pycodestyle.py不存在)。如果遇到这种“玄学错误”,别去排查代码,先把site-packages里的相关包全部清理干净再重装。

2.2 配置文件:从“默认派”到“定制派”的平滑过渡

默认规则不够用,这是必然的。但配置文件怎么写,我强烈建议学习“分层配置”的思路,而不是直接在一个文件里堆满规则。Pylint和Flake8都支持多个配置文件。

对Flake8来说,默认会依次读取:setup.cfg中的[flake8]段、tox.ini中的[flake8]段、.flake8文件,后者优先级最高。我一般直接在项目根目录放一个.flake8文件:

[flake8] max-line-length = 100 max-complexity = 10 exclude = .git,__pycache__,docs,venv,.venv,env,dist,*.egg-info ignore = E203,W503 select = E,W,F,C

简单解释一下每个选项背后的考量:

  • max-line-length = 100:PEP 8官方建议79字符,但现实中大部分团队觉得太紧,我见过110甚至120的。这里100算是一个平衡值,因为GitHub网页在1440分辨率下,100字符左右还能一行显示完,超过就不行了。
  • max-complexity = 10:这个是圈复杂度阈值,也就是McCabe值。超过10意味着一个函数的独立路径数量太多,人脑很难完整推演。10是个经典值,很多大厂默认也用这个数。
  • ignore = E203,W503:W503和E504是二选一的辩证规则。PEP 8本身建议二元运算符换行时新行应该位于运算符之前,但W503这个规则恰好反向,所以现在Flake8默认就忽略W503,你只要手动把E203也忽略掉就基本能跑得干净。
  • 实际经验是,把select列出来可以降低“噪音”,因为Flake8默认会启用所有规则,一旦你装了扩展比如flake8-bandit或flake8-builtins,默认规则就会被扩展的规则冲刷,不指定select容易让输出变得极其混乱。

Pylint的配置更细,我习惯用一个.pylintrc文件,但通常不是一次写完,而是分阶段沉淀。第一次可以直接生成模板:

pylint --generate-rcfile > .pylintrc

这个命令会生成一个包含所有规则的配置文件,有大约900多行。直接用它跑项目,输出会惨烈到让人怀疑人生。所以我更推荐先跑一遍统计,再决定禁哪些:

pylint mypackage/ --reports=y

看report里的summary。重点关注“被禁用规则”和“抑制规则”的比例,如果某条规则触发了超过50次,但实际代码质量并没有因此变差,你就有理由考虑把这条规则关掉或者调低级别。坦白说,如果一上来就拍脑袋disable,很可能把关掉的规则里面含有真正的隐患,那种“先运行后定制”的方式更靠谱。

2.3 Pylint的编号体系:看懂那几个英语单词代表什么

Pylint的报告里每个问题都有一个五位的消息编号,格式是一个大写字母加四个数字。很多新手拿到一条提示,经常看不懂到底是啥问题,这里我整理了一个速查表:

字母含义典型示例
C惯例问题(Convention)C0116 缺少docstring;C0103 命名不符合规范
R重构建议(Refactor)R0913 参数过多;R0912 条件分支过多
W警告(Warning)W0611 导入未使用;W0621 外部作用域变量重定义
E错误(Error)E0602 使用未定义变量;E1120 位置参数缺失
F致命错误(Fatal)F0001 语法解析失败;F0010 无法解析模块

这些编号是Pylint特有的,Flake8的编号完全不同,它的E字符开头的编号来自pycodestyle,W开头的是PyFlakes的警告。所以看到代码检查输出时,先搞清楚来源再处理。

这个细节我觉得特别重要,因为你可能在GitLab或GitHub的CI日志里,看到一条“E501”和一个“C0301”同时指向同一行太长的代码,E501来自Flake8,C0301来自Pylint,理解这个区分才能对症下药。

2.4 Pylint评分机制:别拿“9.99分”较真

Pylint会对项目打一个总分,这个分数模型很多团队会拿来做CI门槛。默认是10分制,根据违规数量和代码可读性计算。关键点在于这个分数可以配置,包括:

  • score:是否要显示分数,yes/no。
  • fail-under:低于多少分就算检查失败,在命令行用--fail-under=8实现。
  • reports:是否输出详细报告,默认yes,但在纯CI脚本里我建议关闭,减少日志噪音。

我遇到过最搞笑的情况是一个团队把CI门槛设成9.5分,结果每次合并一个模块,大家就疯狂在代码里加docstring去“刷分”,正常逻辑没怎么优化,光顾着凑分了。这其实是对静态检查的误用。我建议门槛设在8左右比较合理,因为8分意味着绝大多数“坏味道”已经清掉了,剩下允许一定的自由发挥。

3. 实操过程与核心环节:从命令行到Git钩子再到CI全接入

3.1 命令行基础操作:给你的项目做一次“体检”

在项目根目录执行第一条检查命令:

flake8 src/ tests/

这个命令会检查src和tests目录下所有*.py文件,默认输出格式是:文件名:行号:列号:消息代码:消息描述。比如:

src/models/user.py:42:9: E225 missing whitespace around operator

这种格式的好处是,当你配合IDE或者编辑器(VS Code、PyCharm)打开文件时,代码会将输出解析成“问题面板”里的条目,直接跳到对应行。

Pylint命令则是:

pylint src/ --fail-under=8

如果你的项目有多个包,可以一次全指定:

pylint src/package_a src/package_b tests/

但这里有一个常见的坑:直接在命令行传目录,Pylint会把目录当作包来处理,需要目录里有__init__.py文件,否则它会报告“module not found”或者根本不进入该目录。如果遇到这种问题,可以用--recursive=y参数来处理:

pylint --recursive=y src/ --fail-under=8

这个参数在Pylint 2.14版本以后支持,之前的版本如果目录结构是命名空间包风格(没有__init__.py),会直接跳过。

3.2 让工具在Git提交阶段就把门:pre-commit钩子

“检查做在提交前还是提交后”,这是个效率问题。我强烈建议把Flake8放进pre-commit,Pylint放进pre-push或者CI。因为pre-commit是每次提交都会跑的,Pylint跑得慢,会拖慢本地提交体验;Flake8足够快,能有效拦掉肉眼可见的低级问题。

直接用pre-commit框架来做是最省事的。先安装:

pip install pre-commit

然后在项目根目录创建.pre-commit-config.yaml:

repos: - repo: https://github.com/PyCQA/flake8 rev: 7.0.0 hooks: - id: flake8 args: ["--config=.flake8"] - repo: https://github.com/pycqa/pylint rev: v3.3.1 hooks: - id: pylint args: ["--fail-under=8", "--rcfile=.pylintrc"]

第一次执行:

pre-commit install

这样每次git commit的时候,就会先跑一遍这两个工具,有错误的话提交会被中断,文件留在暂存区。

这里有一个经验和大家说下:不要一开始就把Pylint放进pre-commit。我干过这事儿,结果是团队里每个人都卡在提交阶段,等到想合并分支的时候才发现有一堆历史欠账。更好的做法是先让Flake8进pre-commit跑一周,等大家把Pylint的配置稳定下来,再把Pylint加进pre-commit或者CI。

3.3 接入CI流水线:让质量红线在合并请求前“卡死”

把检查放到CI里,才能真正发挥作用,因为它跑的是“全量代码”,不管是谁的提交,都会被完整检查一遍。以GitHub Actions为例,一个精简的工作流文件可以直接这样写:

name: Code Quality Check on: [push, pull_request] jobs: lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: '3.11' - name: Install dependencies run: | pip install --upgrade pip pip install pylint flake8 - name: Run Flake8 run: flake8 src/ --config=.flake8 - name: Run Pylint run: pylint --recursive=y src/ --rcfile=.pylintrc --fail-under=8

有一点值得注意,如果你们的Python版本没统一,不同环境下检查结果会不一致。比如Pylint对Python 3.10和3.11的某些循环语法检查结果就有细微差别。所以CI里的Python版本最好和开发环境保持一致,或者在矩阵里同时跑几个版本。

类似的,在GitLab CI里,可以写成:

flake8: stage: test script: - flake8 src/ --config=.flake8 - pylint --recursive=y src/ --rcfile=.pylintrc --fail-under=8

3.4 针对历史遗留项目的“渐进式接入”策略

如果是一个老项目,几百个文件全是历史代码,直接加上Pylint的CI门槛,必然全红、全崩。我的做法是先分级处理:先给老文件“免检”,新文件必须达标。

怎么做?Pylint支持.pylintrc里配置白名单或者基线评分,我推荐用“baseline”思路。具体操作是先跑一次,生成一个基线质量报告,然后把基线报告纳入版本控制,后续每次检查时,Pylint会对比基线,只看新增问题:

pylint --recursive=y src/ --load-plugins=pylint_doc_baseline --fail-under=8

如果没有现成的基线插件,手工做一个也很快——第一次检查结果存成result_old.txt,CI脚本里每次跑完check_new.py,用脚本对比一下行数,新增超过阈值就fail。只要脚本保留在仓库里,效果不比专业插件差。

这类渐进式策略非常关键,它保证团队在不推翻历史代码的前提下,让新代码逐步拥有高质量高标准。

4. 常见问题与排查技巧实录

4.1 Flake8报“E203: whitespace before ':'”——标准库的“误报”

如果你用black格式化过代码,会发现black特别喜欢在切片语法里给冒号两边加空格:

my_list[0 : 10]

这本身符合black的格式化风格,但Flake8的E203规则会认为冒号前不应该有空格,它会报错。black和flake8的规则在这一点上是矛盾的。这可以说是社区里最经典的“相爱相杀”了。

解决方案在.flake8配置文件里已经有:把E203加进ignore列表。我前面给的配置里也提到了,这是社区共识,可以放心忽略。

4.2 Pylint不检查tests目录怎么办?

默认情况下,Pylint会对所有目录都按同样的规则检查,这让很多团队很头疼,因为测试代码和业务代码混在一起,命名规则、docstring要求根本不适用。如果直接把tests排除掉,又失去了一层检查。

更好的做法是给tests目录单独设置一份配置,比如通过--rcfile指定不同文件,或者直接在项目根目录下的.pylintrc里控制:

[MASTER] ignore = tests

或者用更精细的方式,在命令行直接传递两份配置:

pylint --rcfile=.pylintrc src/ --rcfile=.pylintrc-tests tests/

这里有个细节要提醒,--rcfile在Pylint老版本中并不支持多次指定,新版(2.12以上)支持,但不同实例的实现方式略有差异,如果你用的Pylint版本比较老,还是建议用ignore把tests单独排除,或者给tests加一个单独的lint任务。

关于测试目录的规则,我的习惯是关闭C0116(缺少docstring),保留未使用导入、未定义变量、重复符号这些基本错误检测。测试代码的function命名本来就是短横线风格的,不按业务模块命名标准走,太严了反而影响写测试的效率。

4.3 Pylint在CI中报“Unable to find module member”错误

这个错误常出现在使用动态导入、__getattr__或者基于协议库(比如SQLAlchemy的session、Django的ORM字段)的项目中。Pylint的静态分析遇到这些动态魔法,就会认为“方法不存在”。

针对单个第三方库,最有效的方式是使用extension-pkg-allow-list和ignored-modules:

[MASTER] ignored-modules = pymongo extension-pkg-allow-list = pymongo

如果你想忽略某个具体模块里的动态成员,还可以用generated-members:

[MASTER] generated-members = requests.codes, sqlalchemy.*

这个设置可以让Pylint知道,这些成员是通过代码生成的,不要在静态分析中乱报警告。

另外一种更彻底的方法,直接在你代码里加注释禁用:

# pylint: disable = no-member

但注释禁用一定要“局部化”,不要放在模块顶部一行禁用,不然挡住的所有问题都会成为后续开发的灰色地带。

4.4 如何让Flake8和Pylint配置互相“兼容”

实际项目里,最头疼的情况倒不是单条规则怎么配,而是Flake8报告E501(行太长)、Pylint报告C0301(行太长),两边都报同一个问题,你改了文件这一行的长度,下个文件又冒出来。

这背后的核心矛盾在于:Flake8的max-line-length和Pylint的max-line-length是各自独立的配置,两边默认值都是79或者100,但如果你把其中一边改成120、另一边没改,就会一直对同一行反复报警。所以,建议两个配置文件里的行宽保持一致,这是一个很低级但很容易被忽略的错误。

我习惯把行宽参数统一定为:

# .flake8 max-line-length = 100 # .pylintrc [FORMAT] max-line-length = 100

改完以后,我还会用一个自动化流程去校验两边配置是否同步。不用写脚本,直接在CI里跑两个工具,同一个文件不出现重复错误码,基本就能判定配置已同步。

4.5 特别提醒:禁用规则要写注释,不要偷偷摸摸

不论你怎么调配置文件,最好在禁止某条规则的时候加一句注释在.pylintrc旁边,或者在代码里写# pylint: disable=xxx。因为代码是给人看的,也是给机器看的,但机器默认是不会解释为什么被禁用的。半年以后你再看一个文件,一条disable=too-many-arguments的注释躺在那里,你得努力回想当初的决策背景。

我采用的具体做法是:用一个单独的pylintrc段来分区管理,每一类rule的disable都配上简短说明。比如:

[MESSAGES CONTROL] # 允许HTTP接口参数过多,因为业务接口就是需要传很多上下文 disable=R0913, # FastAPI路由回调需要返回完整字典 R0911

当然,这条建议不是绝对教条,但它确实能让代码审查者快速理解“为什么这条被封了”。

5. 与编辑器和IDE的集成:让检查变成“打字时的呼吸”

5.1 VS Code里的双工具配置

静态检查不止是CI阶段的事,最好的体验是把它们集成到开发环境里,让问题在写代码的时候就被高亮出来。VS Code里的操作很简单:

Python扩展默认支持配置“linting”,现在新版扩展更推荐直接用“Linting”里的选项,选择Flake8或者Pylint。如果你两个都想用,可以同时安装手动的额外扩展,比如“Pylint”和“Flake8”插件。

我现在的配置方式是:

  • Flake8作为“默认的强制最低标准”,编辑器里所有风格问题都会实时显示。
  • Pylint作为“二级检查”,用于显示设计层面的告警,但不设阻塞级别(默认warn即可)。

主要配置文件在根目录.vscode/settings.json:

{ "python.linting.flake8Enabled": true, "python.linting.flake8Args": ["--config=.flake8"], "python.linting.pylintEnabled": true, "python.linting.pylintArgs": ["--rcfile=.pylintrc"] }

这样设置以后,你写代码的时候就能同时看到“低级格式问题”和“设计建议”,非常直观。有时候一个魔改的函数旁边突然冒出来一行“R0912 too many branches”,会让人忍不住去分解它,这个“实时的压力感”其实是一种好的正向反馈。

5.2 PyCharm配置思路

PyCharm的集成更细腻一点。在Settings -> Tools -> Python Integrated Tools -> linting里,PyCharm原生支持Flake8的规则。

如果你想让两把尺子同时生效,我的方法是把Pylint作为外部工具加进去:Settings -> Tools -> External Tools,添加一个名为“Pylint”的工具,参数设置为:

--rcfile=.pylintrc --fail-under=8 $FileName$

然后可以绑定一个快捷键,比如Ctrl+Alt+L执行Pylint检查,和默认的代码格式化快捷键分开。

这里有个实际体验值得分享:在IDE里实时跑Pylint,性能上会让整个项目变慢,尤其是大项目里会出现高CPU消耗。所以IDE里跑Flake8、提交时跑Pylint,其实是一个非常适配实际办公节奏的方案。

6. 性能调优与规则扩展:更大项目里的脚手架

6.1 让Pylint跑得更快的几个参数

前面提到Pylint慢,但项目上了规模之后,这个“慢”会变成让人挠头的瓶颈。好在Pylint有几个参数可以改善体验:

pylint --jobs=4 --recursive=y src/

--jobs=4表示用4个进程并行检查,在四核八线程机器上效果明显,大项目平均能缩短40%左右的时间。另外可以关掉report和score来节省IO:

pylint --reports=n --score=n src/

这种组合下去,一个2000个文件的工程,从40秒左右的耗时能压到10秒出头,放到CI里也能接受。

在非常庞大的代码库场景下,Flake8也有并行方案,社区里有flake8-parallel扩展,效果也不错,但我个人还没遇到必须用它的境地,普通Flake8几十秒内能完成全量检查。如果真到了那个规模,可以再考虑pytest的Massif插件或者Invoke缓存加速方案,但核心思路是“缓存、增量、并行”,万变不离其宗。

6.2 用插件扩充两个工具的边界

静态检查工具是“地基”,插件是“装修”。如果你的项目有自己的代码约定,比如对类名、函数名前缀有特殊规定,或者要求每个public方法必须有docstring中的Returns段,那就得靠自定义插件实现了。

Flake8的插件生态非常丰富:flake8-builtins检查你是否覆盖了Python内置名称(比如list = [1,2])、flake8-docstrings要求函数必须有文档字符串、flake8-annotations强制要求类型注解、flake8-import-order管理导入顺序。你可以这样安装:

pip install flake8-builtins flake8-docstrings flake8-annotations flake8-import-order

然后在.flake8配置文件里增加:

extend-ignore = D100,D104

Pylint的插件则一般写在load-plugins里,比如pylint_django、pylint_flask、pylint_pytest都是非常成熟的选择:

pip install pylint-django
[MASTER] load-plugins = pylint_django django_settings_module = myproject.settings

装上django插件以后,Pylint就不会对models.Model的objects报no-member错误了,对Django的视图、URLconf的检查也更精准。

6.3 让两个工具共用一套“规则字典”

当项目的团队文化渐渐成型,你会希望能把规则同步到所有工具的检查里,避免开发在一个工具上改了10行,到了CI又被另一个工具指出同样问题。

趁早把这几个配置文件塑造成“单一事实来源”:.flake8、.pylintrc、setup.cfg、pyproject.toml。把统一的行宽、命名规范、复杂度容忍度放在同一个入口,比如在pyproject.toml中定义研发规范元数据,然后在CI脚本中用代码模板同时生成两个工具的配置。这样下次团队内调整策略时,只改一份文件,所有工具的行为都保持一致。

7. 我的实际体会与一个小技巧

最后说点经验之谈。我见过太多团队把Pylint和Flake8当成“挑刺工具”,时间长了,开发者会对它们产生心理上的排斥。但如果你把它们当成“导航仪”,心态完全不同。有一次我们在重构一个老模块时,Flake8瞬间揪出了几十个未使用的导入,我们顺着那个清单删掉了很多废代码,整个模块启动时间直接快了15%。还有一次Pylint在CI中拦下了一个except Exception的裸捕获,那句话在几个月后救了我们一整套服务——因为那个例外被隐式吞掉的话,排查线上故障会极其痛苦。

所以与其说服自己“这些工具真麻烦”,不如把检查结果当作“代码评审意见”,有选择的采纳,有耐心的调整。遇到一条规则不合业务场景,先改配置并注明原因,而不是一禁了之。这样时间久了,团队的代码质量自然水涨船高。

另外分享一个非常实用的小技巧:如果你刚接手一个项目,对这个项目的历史质量一头雾水,别急着写需求,先跑一遍:

flake8 src/ | wc -l pylint src/ --reports=y | grep "Your code has been rated at"

第一行输出的是Flake8发现的问题总数,第二行输出的是Pylint的代码评分。这两组数字一出来,你对这个项目的“底子”基本就有数了。后续你能做的优化范围、精力分配,都清晰得多。这算是静态检查工具一个不少人不注意的“隐藏用法”。如果你的项目也需要上这套流程,就照这个思路去搭,稳的。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询