flake8启动慢是因默认加载所有已安装插件(如flake8-bugbear),即使未使用其规则也要导入初始化;ruff check冷启动快(

flake8 启动慢是因为它要加载一堆插件
你执行 flake8 时卡顿一两秒,不是你的项目大,而是它默认会扫描并导入所有已安装的 flake8 插件(比如 flake8-bugbear、flake8-builtins),每个插件都要 import、注册、初始化。哪怕你没用到它们的规则,也得走一遍。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 用
flake8 --list-plugins看当前启用了哪些插件,删掉不用的(比如pip uninstall flake8-2020) - 加
--disable-noqa或--quiet对速度影响微乎其微,别指望靠参数“优化”启动时间 - 如果只想要基础 PEP8 + PyFlakes + McCabe,直接用
pyflakes+pycodestyle组合,比精简后的 flake8 还快一点
ruff check 启动快但默认不兼容 flake8 规则名
ruff check 从磁盘读文件、解析 AST、跑规则,整个流程是单进程纯 Rust 实现,冷启动通常在 100ms 内。但它默认启用的规则集(RUF、ERA、RET 等)和 flake8 的 E/F/W 编号体系不对应——比如 F401(未使用导入)在 ruff 里是 UP001,E501(行太长)默认压根不开启。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 想无缝替换 flake8,先跑
ruff check --select=E,F,W,再加--extend-select=I(import 相关)补全常用项 -
ruff check --fix能自动修 80%+ 的格式/简单逻辑问题,但别对try/except或带副作用的表达式盲目 auto-fix - 注意
ruff不检查__init__.py是否为空、不报print()调用——这些属于 flake8 插件行为,ruff 默认不模拟
规则覆盖差异:ruff 覆盖面更广,但部分 flake8 插件逻辑无法平移
ruff 内置了 600+ 条规则,包括很多 flake8 靠插件实现的功能(如避免硬编码字符串、检测错误的类型注解语法),但它不支持动态 Python 插件机制。像 flake8-pytest-style 这类依赖运行时 AST 分析+测试上下文推断的规则,ruff 目前无法等价替代。
常见错配现象:
- 你用
flake8 --select=PT001,PT002检测 pytest 命名风格,换成 ruff 就得手动写per-file-ignores或放弃 -
flake8-bandit做安全扫描?ruff 不做这类事情,得保留 bandit 单独跑 - ruff 的
UP037(f-string 替代 % 格式化)比 flake8 的YTT插件更激进,可能误报 f-string 中含换行或复杂表达式的情况
CI 里混用或迁移时,.flake8 和 pyproject.toml 的配置别直接拷贝
flake8 读 .flake8 或 [flake8] 段,ruff 只认 [tool.ruff]。两者 ignore 列表语法不同:ignore = ["E501", "F401"] 在 flake8 里生效,在 ruff 里会被忽略——ruff 要写成 select = ["E", "F"] 再配合 ignore = ["E501", "F401"]。
容易踩的坑:
- 别在 ruff 配置里写
max-line-length = 88就以为能替代 flake8 的max-line-length——ruff 默认不启用行长检查,得显式加select = ["E501"] - CI 脚本里如果写了
flake8 --config=.flake8,换成 ruff 不能只改命令,必须同步迁移配置到pyproject.toml - ruff 的
--output-format=github适配 GitHub Actions 注释,但 flake8 的--format=pylint输出结构完全不同,CI 解析脚本得重写
最麻烦的其实是团队习惯:有人习惯了看 F841 就知道是未使用变量,换成 FBT003 或 ERA001 会懵几秒——这不是工具问题,是认知成本。










