好的,各位观众老爷们,欢迎来到“码农的自我修养”讲座!今天咱们聊聊如何偷懒……哦不,是如何提升效率,让代码既漂亮又规范的“三剑客”: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 的排序规则如下:
- 标准库 import
- 第三方库 import
- 本地应用/库 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
-
安装 pre-commit hooks:
pre-commit install
-
每次提交代码之前,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 可以简化你的工具链,提高效率。
最后的话
希望今天的讲座对大家有所帮助。记住,自动化是提升效率的关键。让我们一起拥抱自动化,解放生产力,创造更美好的世界!
谢谢大家!