pre-commit 代码规范:ruff + black + isort + trailing-whitespace 自动化校验

一句话:pre-commit是一个Git钩子管理工具,可以在代码提交前自动运行代码检查、格式化等任务。结合ruff、black、isort等工具,可以自动化代码质量控制。

1. pre-commit 基础

1.1 什么是pre-commit?


graph LR

    A[代码提交] --> B[pre-commit钩子]

    B --> C[运行检查]

    C --> D{通过?}

    D -->|是| E[允许提交]

    D -->|否| F[阻止提交]

    style B fill:#e1f5fe

pre-commit:Git钩子管理工具,可以在代码提交前自动运行检查任务。

1.2 安装和配置

 
# 安装
 
pip install pre-commit
 
# 初始化
 
pre-commit install
 

1.3 配置文件

 
# .pre-commit-config.yaml
 
repos:
 
  - repo: https://github.com/psf/black
 
    rev: 23.3.0
 
    hooks:
 
      - id: black
 
        language_version: python3.11
 
  - repo: https://github.com/pycqa/isort
 
    rev: 5.12.0
 
    hooks:
 
      - id: isort
 
  - repo: https://github.com/charliermarsh/ruff
 
    rev: v0.0.261
 
    hooks:
 
      - id: ruff
 
        args: [--fix]
 
  - repo: https://github.com/pre-commit/pre-commit-hooks
 
    rev: v4.4.0
 
    hooks:
 
      - id: trailing-whitespace
 
      - id: end-of-file-fixer
 
      - id: check-yaml
 
      - id: check-added-large-files
 

2. 代码格式化工具

2.1 Black

 
# Black配置
 
repos:
 
  - repo: https://github.com/psf/black
 
    rev: 23.3.0
 
    hooks:
 
      - id: black
 
        language_version: python3.11
 
        args: [--line-length=88]
 

Black特点

  • 自动格式化代码

  • 统一代码风格

  • 不可配置(只有少量选项)

2.2 isort

 
# isort配置
 
repos:
 
  - repo: https://github.com/pycqa/isort
 
    rev: 5.12.0
 
    hooks:
 
      - id: isort
 
        args: [--profile=black]
 

isort特点

  • 自动排序import语句

  • 按类型分组

  • 与Black兼容

2.3 Ruff

 
# Ruff配置
 
repos:
 
  - repo: https://github.com/charliermarsh/ruff
 
    rev: v0.0.261
 
    hooks:
 
      - id: ruff
 
        args: [--fix]
 

Ruff特点

  • 极快的Python linter

  • 替代flake8、pylint等

  • 支持自动修复

3. 配置示例

3.1 完整配置

 
# .pre-commit-config.yaml
 
repos:
 
  # 代码格式化
 
  - repo: https://github.com/psf/black
 
    rev: 23.3.0
 
    hooks:
 
      - id: black
 
        language_version: python3.11
 
  - repo: https://github.com/pycqa/isort
 
    rev: 5.12.0
 
    hooks:
 
      - id: isort
 
        args: [--profile=black]
 
  # 代码检查
 
  - repo: https://github.com/charliermarsh/ruff
 
    rev: v0.0.261
 
    hooks:
 
      - id: ruff
 
        args: [--fix]
 
  # 通用检查
 
  - repo: https://github.com/pre-commit/pre-commit-hooks
 
    rev: v4.4.0
 
    hooks:
 
      - id: trailing-whitespace
 
      - id: end-of-file-fixer
 
      - id: check-yaml
 
      - id: check-added-large-files
 
      - id: check-merge-conflict
 
  # 类型检查
 
  - repo: https://github.com/pre-commit/mirrors-mypy
 
    rev: v1.3.0
 
    hooks:
 
      - id: mypy
 
        additional_dependencies: [types-requests]
 

3.2 项目特定配置

 
# .pre-commit-config.yaml
 
repos:
 
  # Python代码质量
 
  - repo: https://github.com/psf/black
 
    rev: 23.3.0
 
    hooks:
 
      - id: black
 
        language_version: python3.11
 
  - repo: https://github.com/pycqa/isort
 
    rev: 5.12.0
 
    hooks:
 
      - id: isort
 
        args: [--profile=black]
 
  - repo: https://github.com/charliermarsh/ruff
 
    rev: v0.0.261
 
    hooks:
 
      - id: ruff
 
        args: [--fix]
 
  # 前端代码质量
 
  - repo: https://github.com/pre-commit/mirrors-eslint
 
    rev: v8.40.0
 
    hooks:
 
      - id: eslint
 
        files: \.(js|jsx|ts|tsx)$
 
        types: [file]
 
        additional_dependencies:
 
          - eslint@8.40.0
 
          - eslint-config-standard@17.0.0
 
  # 文档检查
 
  - repo: https://github.com/igorshubovych/markdownlint-cli
 
    rev: v0.33.0
 
    hooks:
 
      - id: markdownlint
 
        args: [--fix]
 

4. 使用技巧

4.1 手动运行

 
# 运行所有钩子
 
pre-commit run --all-files
 
# 运行特定钩子
 
pre-commit run black --all-files
 
pre-commit run isort --all-files
 

4.2 跳过钩子

 
# 跳过钩子提交
 
git commit -m "feat: 添加功能" --no-verify
 
# 临时跳过特定钩子
 
SKIP=ruff git commit -m "feat: 添加功能"
 

4.3 更新钩子

 
# 更新所有钩子
 
pre-commit autoupdate
 
# 更新特定钩子
 
pre-commit autoupdate --repo https://github.com/psf/black
 

5. 实际案例

5.1 FastAPI项目配置

 
# .pre-commit-config.yaml
 
repos:
 
  # Python代码质量
 
  - repo: https://github.com/psf/black
 
    rev: 23.3.0
 
    hooks:
 
      - id: black
 
        language_version: python3.11
 
  - repo: https://github.com/pycqa/isort
 
    rev: 5.12.0
 
    hooks:
 
      - id: isort
 
        args: [--profile=black]
 
  - repo: https://github.com/charliermarsh/ruff
 
    rev: v0.0.261
 
    hooks:
 
      - id: ruff
 
        args: [--fix]
 
  - repo: https://github.com/pre-commit/mirrors-mypy
 
    rev: v1.3.0
 
    hooks:
 
      - id: mypy
 
        additional_dependencies: [types-requests]
 
  # 通用检查
 
  - repo: https://github.com/pre-commit/pre-commit-hooks
 
    rev: v4.4.0
 
    hooks:
 
      - id: trailing-whitespace
 
      - id: end-of-file-fixer
 
      - id: check-yaml
 
      - id: check-added-large-files
 

5.2 多语言项目配置

 
# .pre-commit-config.yaml
 
repos:
 
  # Python
 
  - repo: https://github.com/psf/black
 
    rev: 23.3.0
 
    hooks:
 
      - id: black
 
  # JavaScript/TypeScript
 
  - repo: https://github.com/pre-commit/mirrors-eslint
 
    rev: v8.40.0
 
    hooks:
 
      - id: eslint
 
        files: \.(js|jsx|ts|tsx)$
 
  # Markdown
 
  - repo: https://github.com/igorshubovych/markdownlint-cli
 
    rev: v0.33.0
 
    hooks:
 
      - id: markdownlint
 

6. 常见坑点

1. 钩子执行缓慢

 
# 解决:只检查修改的文件
 
repos:
 
  - repo: https://github.com/psf/black
 
    rev: 23.3.0
 
    hooks:
 
      - id: black
 
        files: \.py$
 

2. 钩子冲突

 
# 解决:调整钩子执行顺序
 
repos:
 
  - repo: https://github.com/pycqa/isort
 
    rev: 5.12.0
 
    hooks:
 
      - id: isort
 
  - repo: https://github.com/psf/black
 
    rev: 23.3.0
 
    hooks:
 
      - id: black
 

3. 配置错误

 
# 解决:使用pre-commit验证配置
 
pre-commit validate-config .pre-commit-config.yaml
 

核心要点

 
# 安装
 
pip install pre-commit
 
pre-commit install
 
# 运行
 
pre-commit run --all-files
 
# 更新
 
pre-commit autoupdate
 
# 配置文件
 
.pre-commit-config.yaml
 

速记卡(面试闪卡)

Q1:一句话讲清「pre-commit 代码规范:ruff + black + isort + trailing-whitespace 自动化校验」到底是什么?

A:pre-commit 是 Git 提交前自动跑检查/格式化的钩子管理器,串起 ruff、black、isort 等工具,把代码质量卡在提交前。

Q2:1. pre-commit 基础 —— 怎么理解?

A:像单位门口的安检机:你一提交代码,钩子就拦下自动体检,合格才放行进库、不合格当场退回。它本质是 Git hook 管理器,pip install + pre-commit install 一条命令接管提交闸门。

Q3:2. 代码格式化工具 —— 怎么理解?

A:black 是无可辩驳的格式化器(只少量选项,统一风格);isort 按类型给 import 排序并与 black 兼容;ruff 是极快 linter,替代 flake8/pylint 还支持 —fix 自动修。三者分工:格式化、排序、挑刺。

Q4:3/4. 配置与技巧 —— 怎么理解?

A:在 .pre-commit-config.yaml 里列 repos 挂 hooks 即可,按需加 mypy 做类型检查、markdownlint 查文档。手动 pre-commit run —all-files 全量跑;SKIP=ruff 临时跳过;autoupdate 升版本。—no-verify 能强跳(别滥用)。

Q5:5/6. 实际案例与坑点 —— 怎么理解?

A:多语言项目可同时挂 Python(black/ruff)、前端(eslint)、文档(markdownlint)。坑:钩子慢就 files 限定后缀;多钩子改同一文件要调顺序;配置写错用 pre-commit validate-config 校验。

Q6:核心速记主线有哪些?

  • pre-commit 是 Git 提交前自动跑检查/格式化的钩子管理器

  • black 统一风格、isort 排 import、ruff 快查兼自动修

  • 配置文件 .pre-commit-config.yaml 列 repos 挂 hooks

  • 慢就限 files、冲突调顺序、配置用 validate-config 校验

口诀

A:pre-commit 守门

提交前先体检

black ruff isort

代码质量稳如山

相关链接