Black/Isort/Ruff:自动化代码格式化与 Linting

好的,各位观众老爷们,欢迎来到“码农的自我修养”讲座!今天咱们聊聊如何偷懒……哦不,是如何提升效率,让代码既漂亮又规范的“三剑客”:Black、isort和Ruff。

前言:码农之痛与自动化之光

话说,咱们码农每天都在跟代码打交道。除了实现功能,还得操心代码的格式、风格,比如缩进用几个空格、换行在哪儿换、import语句怎么排序……哎,真是剪不断,理还乱!

手动格式化?那简直是噩梦!改一行代码,可能要调整半天格式。而且,团队成员风格不统一,代码review的时候光挑格式问题了,谁还有心思看逻辑?

还好,时代在进步,工具在发展。有了自动化代码格式化和linting工具,咱们就能从繁琐的格式调整中解放出来,专注于更有价值的事情。

主角登场:Black、isort和Ruff

今天的主角就是 Black、isort 和 Ruff 这三位大神。他们各自负责一块,分工明确,配合默契,能帮你把代码收拾得井井有条。

  • Black: 代码格式化界的“独裁者”。它会按照一套固定的规则,强制格式化你的代码,不给你任何讨价还价的余地。好处是,团队成员的代码风格会高度统一,再也不用为格式问题争论了。
  • isort: import 语句的整理大师。它会自动对 import 语句进行排序、分组,让你的 import 语句看起来整洁有序。
  • Ruff: 集 linting、格式化和自动修复于一身的瑞士军刀。它速度极快,功能强大,可以替代 flake8、pylint 等多个工具,让你的代码更加规范、健壮。

第一幕:Black——代码格式化的“霸道总裁”

Black 的特点就是“不妥协”。它有一套自己的格式化规则,一旦你用了 Black,就得接受它的规则。当然,Black 的规则是经过精心设计的,能保证代码的可读性和一致性。

安装 Black

pip install black

使用 Black

black your_file.py

这条命令会直接修改 your_file.py 文件的内容,按照 Black 的规则进行格式化。

Black 的格式化规则

Black 的格式化规则有很多,这里列举几个常见的:

  • 行长度: 默认行长度为 88 个字符。
  • 字符串引号: 优先使用双引号。
  • 缩进: 使用 4 个空格进行缩进。
  • 函数和类定义: 函数和类定义前后要有空行。

示例

假设有这样一段代码:

def  my_function(arg1,arg2):
    if arg1> arg2:
        return arg1 - arg2
    else:
        return arg2-arg1

运行 black your_file.py 后,代码会被格式化成这样:

def my_function(arg1, arg2):
    if arg1 > arg2:
        return arg1 - arg2
    else:
        return arg2 - arg1

可以看到,Black 自动在函数定义前后添加了空行,调整了缩进,让代码看起来更清晰。

Black 的配置

虽然 Black 的规则是固定的,但你还是可以进行一些配置,比如修改行长度:

black --line-length 120 your_file.py

或者,在 pyproject.toml 文件中进行配置:

[tool.black]
line-length = 120

第二幕:isort——import 语句的“整理控”

import 语句是 Python 代码的重要组成部分。但如果 import 语句杂乱无章,会严重影响代码的可读性。isort 就是用来解决这个问题的。

安装 isort

pip install isort

使用 isort

isort your_file.py

这条命令会直接修改 your_file.py 文件的内容,按照 isort 的规则对 import 语句进行排序和分组。

isort 的排序规则

isort 的排序规则如下:

  1. 标准库 import
  2. 第三方库 import
  3. 本地应用/库 import

每个分组内的 import 语句按照字母顺序排序。

示例

假设有这样一段代码:

import os
import requests
from my_module import my_function
import sys
from flask import Flask

运行 isort your_file.py 后,代码会被格式化成这样:

import os
import sys

import requests
from flask import Flask

from my_module import my_function

可以看到,isort 自动对 import 语句进行了排序和分组,让代码看起来更整洁。

isort 的配置

isort 提供了丰富的配置选项,可以满足各种需求。比如,你可以指定 import 语句的分组方式:

[tool.isort]
sections = ["STDLIB", "THIRDPARTY", "FIRSTPARTY", "LOCALFOLDER"]

或者,你可以忽略某些文件或目录:

[tool.isort]
skip = [".venv", "migrations"]

第三幕:Ruff——代码质量的“全能王”

Ruff 是一个用 Rust 编写的 Python linting 工具。它速度极快,功能强大,可以替代 flake8、pylint 等多个工具。

安装 Ruff

pip install ruff

使用 Ruff

ruff check your_file.py

这条命令会对 your_file.py 文件进行 linting 检查,并输出发现的问题。

Ruff 的功能

Ruff 提供了以下功能:

  • Linting: 检查代码是否符合 PEP 8 规范,以及是否存在潜在的错误。
  • 格式化: 自动格式化代码,与 Black 兼容。
  • 自动修复: 自动修复一些常见的代码问题。

示例

假设有这样一段代码:

def my_function(a, b):
    """This is a function."""
    x= a + b
    return x

运行 ruff check your_file.py 后,会输出以下信息:

your_file.py:3:1: F841 [*] Local variable `x` is assigned to but never used
Found 1 error.
[*] 1 fixable with the `--fix` option.

Ruff 发现变量 x 被赋值但未使用,并给出了相应的提示。

Ruff 的配置

Ruff 提供了丰富的配置选项,可以满足各种需求。比如,你可以指定要启用的规则:

[tool.ruff]
select = ["E", "F", "W"]

或者,你可以忽略某些规则:

[tool.ruff]
ignore = ["E501"]

三剑客的配合

Black、isort 和 Ruff 可以完美地配合使用,打造一套完整的自动化代码格式化和 linting 流程。

配置示例

pyproject.toml 文件中进行如下配置:

[tool.black]
line-length = 120

[tool.isort]
profile = "black"

[tool.ruff]
select = ["E", "F", "W"]
ignore = ["E501"]
fix = true

这样,你就可以使用以下命令来格式化和 linting 你的代码:

black your_file.py
isort your_file.py
ruff check --fix your_file.py

或者,你可以使用 pre-commit 来自动运行这些工具。

Pre-commit 集成

pre-commit 是一个用于管理 pre-commit hooks 的工具。它可以让你在每次提交代码之前自动运行 Black、isort 和 Ruff,确保你的代码符合规范。

安装 pre-commit

pip install pre-commit

配置 pre-commit

在你的项目根目录下创建一个 .pre-commit-config.yaml 文件,并添加以下内容:

repos:
  - repo: https://github.com/psf/black
    rev: 23.3.0  # 请使用最新版本
    hooks:
      - id: black
  - repo: https://github.com/PyCQA/isort
    rev: 5.12.0  # 请使用最新版本
    hooks:
      - id: isort
        args: ["--profile", "black"]
  - repo: https://github.com/charliermarsh/ruff-pre-commit
    rev: v0.0.267  # 请使用最新版本
    hooks:
      - id: ruff
        args: ["--fix", "--exit-non-zero-on-fix"]

使用 pre-commit

  1. 安装 pre-commit hooks:

    pre-commit install
  2. 每次提交代码之前,pre-commit 会自动运行 Black、isort 和 Ruff,并检查你的代码是否符合规范。如果发现问题,pre-commit 会阻止你提交代码,直到你修复了这些问题。

总结:码农的幸福生活

有了 Black、isort 和 Ruff 这三位大神,咱们码农就能从繁琐的格式调整中解放出来,专注于更有价值的事情。代码既漂亮又规范,review 效率也大大提高。

  • 统一的代码风格: Black 强制格式化代码,确保团队成员的代码风格高度统一。
  • 整洁的 import 语句: isort 自动对 import 语句进行排序和分组,让代码看起来更整洁。
  • 高质量的代码: Ruff 检查代码是否符合 PEP 8 规范,以及是否存在潜在的错误,提高代码质量。
  • 自动化流程: pre-commit 自动运行 Black、isort 和 Ruff,确保每次提交的代码都符合规范。

总而言之,Black、isort 和 Ruff 是码农提升效率、改善代码质量的必备神器。赶紧用起来,享受幸福的编程生活吧!

Q&A 环节

  • Q:Black 会不会过度格式化我的代码,让我无法忍受?

    A:Black 的规则是经过精心设计的,通常不会出现过度格式化的情况。如果你实在无法忍受,可以尝试调整 Black 的配置,或者选择其他格式化工具。但请记住,统一的代码风格比个性化的格式更重要。

  • Q:Ruff 的速度真的比 flake8 快吗?

    A:是的,Ruff 的速度比 flake8 快很多。这是因为 Ruff 是用 Rust 编写的,性能更高。

  • Q:我可以使用其他 linting 工具吗?

    A:当然可以。但 Ruff 已经足够强大,可以替代 flake8、pylint 等多个工具。使用 Ruff 可以简化你的工具链,提高效率。

最后的话

希望今天的讲座对大家有所帮助。记住,自动化是提升效率的关键。让我们一起拥抱自动化,解放生产力,创造更美好的世界!

谢谢大家!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注