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

好的,各位观众老爷们,欢迎来到今天的“代码美容院”特别节目!我是你们的金牌造型师——老码(别问我真名,程序员都是匿名大佬)。今天咱们不聊高并发,不谈大数据,就来唠唠嗑,聊聊咱们程序员的“面子工程”:代码格式化和 Linting。

啥?你说代码能跑就行,要啥面子?

哎哟喂,这话可不对了!代码是写给机器跑的,没错,但更是写给人看的啊!想想你接手一个“屎山”项目,缩进混乱、命名随意,注释比代码还少,是不是想原地爆炸?所以啊,代码的颜值,直接关系到你的心情,甚至你的绩效!

今天,我们就请来三位“美容大师”:Black、Isort 和 Ruff,来给我们的代码做个全方位、立体式的 SPA!

第一位大师:Black – 钢铁直男的格式化

Black 的口号是:“Uncompromising Code Formatter”。翻译过来就是:我是个钢铁直男,格式化代码绝不妥协!

Black 的特点非常鲜明:

  • 简单粗暴: 你不需要配置任何规则,Black 默认有一套自己的格式化标准。
  • 一键搞定: 运行 Black,它会自动将你的代码格式化成符合其标准的风格。
  • 强制统一: 团队使用 Black 可以保证代码风格的完全一致,减少撕逼大战。

Black 的“美容标准”:

  • 缩进: 4 个空格
  • 行长: 默认 88 字符(可以配置)
  • 字符串引号: 优先使用双引号
  • 表达式: 适当添加空格,使代码更易读

上手实战:

  1. 安装 Black:

    pip install black
  2. 格式化代码:

    black your_file.py

    或者格式化整个目录:

    black your_directory
  3. 检查代码是否需要格式化(不实际修改):

    black --check your_file.py
  4. 配置行长:

    black --line-length 120 your_file.py

代码示例:

# 原始代码 (一团糟)
def my_function(  long_parameter_name, another_long_parameter_name):
    if long_parameter_name > another_long_parameter_name:
        print ("Hello, world!")
    else:
        return    None
# 使用 Black 格式化后的代码 (瞬间清爽)
def my_function(
    long_parameter_name, another_long_parameter_name
):
    if long_parameter_name > another_long_parameter_name:
        print("Hello, world!")
    else:
        return None

Black 的优点:

  • 零配置: 节省大量配置时间,开箱即用。
  • 风格统一: 保证整个团队的代码风格一致。
  • 高效: 格式化速度快。

Black 的缺点:

  • 过于固执: 无法自定义太多格式化规则,如果你有自己的偏好,可能会感到不适应。
  • 部分场景下,代码可读性会略微降低。

总结:

如果你追求简单、高效、统一的代码风格,并且愿意接受 Black 的“强制爱”,那么 Black 绝对是你的不二之选!

第二位大师:Isort – 模块导入的整理专家

Isort 专门负责整理 Python 模块的导入顺序,让你的 import 语句井然有序。

Isort 的“美容标准”:

  • 自动排序:import 语句按照字母顺序排列。
  • 分组管理:import 语句分为标准库、第三方库、本地模块等不同的组。
  • 移除重复: 自动移除重复的 import 语句。

上手实战:

  1. 安装 Isort:

    pip install isort
  2. 整理导入顺序:

    isort your_file.py

    或者整理整个目录:

    isort your_directory
  3. 检查导入顺序是否需要整理(不实际修改):

    isort --check your_file.py
  4. 配置 Isort:

    Isort 提供了丰富的配置选项,可以通过 pyproject.toml.isort.cfg 文件进行配置。

代码示例:

# 原始代码 (混乱不堪)
import os
import sys
from django.conf import settings
import requests
from my_project.utils import my_util
from .models import MyModel
# 使用 Isort 整理后的代码 (赏心悦目)
import os
import sys

import requests
from django.conf import settings

from .models import MyModel
from my_project.utils import my_util

Isort 的优点:

  • 提高可读性: 整理后的 import 语句更加清晰易读。
  • 减少冲突: 避免因 import 顺序导致的潜在问题。
  • 方便维护: 易于查找和管理 import 语句。

Isort 的缺点:

  • 需要配置: 默认配置可能不符合你的需求,需要进行适当的配置。
  • 与 Black 配合使用时,需要注意配置冲突。

总结:

Isort 就像一位细心的管家,帮你整理好房间里的物品,让一切井井有条。如果你注重代码的整洁性,那么 Isort 绝对值得拥有!

第三位大师:Ruff – 速度如闪电的 Linting 工具

Ruff 是一个用 Rust 编写的 Python Linter,它的特点是:快!非常快!快到让你怀疑人生!

Ruff 的“美容标准”:

Ruff 集成了大量的 Linting 规则,包括:

  • PEP 8 风格检查: 检查代码是否符合 PEP 8 规范。
  • 代码错误检测: 检测潜在的代码错误,例如未使用的变量、重复的 import 语句等。
  • 安全漏洞检测: 检测潜在的安全漏洞,例如 SQL 注入、XSS 攻击等。
  • 代码风格检查: 检查代码风格是否一致,例如命名规范、注释规范等。

上手实战:

  1. 安装 Ruff:

    pip install ruff
  2. 运行 Ruff:

    ruff your_file.py

    或者检查整个目录:

    ruff your_directory
  3. 自动修复:

    Ruff 可以自动修复部分 Linting 错误。

    ruff --fix your_file.py
  4. 配置 Ruff:

    Ruff 提供了丰富的配置选项,可以通过 pyproject.toml 文件进行配置。

代码示例:

# 原始代码 (问题多多)
def my_function(a,b):
    """This is a docstring."""
    x = a + b # This is a comment
    return x
# Ruff 的输出 (指出问题所在)
your_file.py:1:1: E113 Missing parameter type for 'a'
your_file.py:1:3: E113 Missing parameter type for 'b'
your_file.py:1:1: ANN001 Missing type annotation for function argument 'a'
your_file.py:1:3: ANN001 Missing type annotation for function argument 'b'
your_file.py:1:1: ANN201 Missing return type annotation for public function
your_file.py:3:5: F841 Local variable 'x' is assigned to but never used

Ruff 的优点:

  • 速度快: 比传统的 Linter 快 10-100 倍。
  • 功能强大: 集成了大量的 Linting 规则。
  • 易于配置: 可以通过 pyproject.toml 文件进行配置。
  • 自动修复: 可以自动修复部分 Linting 错误。

Ruff 的缺点:

  • 部分规则可能过于严格,需要根据实际情况进行调整。

总结:

Ruff 就像一位严厉的老师,时刻监督你的代码,帮你找出潜在的问题,提升代码质量。如果你追求高效、高质量的代码,那么 Ruff 绝对是你的必备利器!

三位大师的配合:打造完美代码

这三位大师可以完美配合,打造出整洁、规范、高质量的代码:

  1. 使用 Black 进行代码格式化,统一代码风格。
  2. 使用 Isort 整理模块导入顺序,提高代码可读性。
  3. 使用 Ruff 进行 Linting 检查,发现潜在问题,提升代码质量。

配置示例 (pyproject.toml):

[tool.black]
line-length = 120

[tool.isort]
profile = "black"

[tool.ruff]
line-length = 120
select = [
    "E",    # pycodestyle errors
    "W",    # pycodestyle warnings
    "F",    # pyflakes
    "I",    # isort
    "C",    # flake8-comprehensions
    "B",    # flake8-bugbear
    "ANN",  # flake8-annotations
    "S",    # flake8-bandit
]
ignore = [
    "E501", # Line too long (handled by Black)
]
fix = true

自动化流程:让代码“自动美容”

为了更高效地使用这三位大师,我们可以将它们集成到 Git Hooks 或 CI/CD 流程中,实现代码的“自动美容”。

Git Hooks:

可以在 .git/hooks 目录下添加 pre-commit 钩子,在每次提交代码前自动运行 Black、Isort 和 Ruff。

#!/bin/bash

# Format code with Black
black .

# Sort imports with Isort
isort .

# Lint code with Ruff
ruff --fix .

# Add changes to staging area
git add .

# Exit with success
exit 0

CI/CD 流程:

可以将 Black、Isort 和 Ruff 集成到 CI/CD 流程中,在每次代码提交或合并时自动运行,确保代码质量。

例如,使用 GitHub Actions:

name: Code Style Check

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3
      - name: Set up Python 3.9
        uses: actions/setup-python@v3
        with:
          python-version: "3.9"
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install black isort ruff
      - name: Format with Black
        run: black --check .
      - name: Sort imports with Isort
        run: isort --check .
      - name: Lint with Ruff
        run: ruff .

总结:

代码格式化和 Linting 是提升代码质量、提高开发效率的重要手段。Black、Isort 和 Ruff 这三位大师可以帮助我们打造整洁、规范、高质量的代码。通过将它们集成到 Git Hooks 或 CI/CD 流程中,我们可以实现代码的“自动美容”,让我们的代码更加赏心悦目!

好了,今天的“代码美容院”特别节目就到这里了。希望各位观众老爷们能够学以致用,让自己的代码也变得美美哒!我们下期再见!

发表回复

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