Python 格式化工具
什么是 Python 格式化?
Python 格式化工具会用一致的缩进、换行和结构整理 Python 代码。Python 的缩进本身就是语法的一部分,因此复制混乱或风格混杂的代码不只是难看,还可能改变行为或直接报错。这个工具适合处理脚本、Notebook 片段、生成代码、学习示例、代码评审和小型重构,让函数、类、import、列表、字典和嵌套表达式更容易阅读。格式化不会修复逻辑错误、类型问题、缺失依赖、运行环境问题或 API 误用。在真实项目中,输出应与 Black、Ruff、isort 或团队规范保持一致。
使用方法
使用步骤
- 在左侧输入框中粘贴或输入Python代码
- 选择缩进大小(2个空格、4个空格或Tab)
- 点击'格式化'美化代码,或点击'压缩'减小体积
- 在右侧查看结果(带语法高亮)
- 点击'复制'复制到剪贴板
选项说明
Python技巧
- Python对缩进敏感,因此在将结果复制回项目之前,请检查格式化后的控制块。
- 格式化不会运行类型检查、导入或测试。请使用常规的Python工具进行行为和依赖验证。
使用场景
技术原理
格式化器首先使用 tokenize 模块或自定义词法分析器扫描代码,将每行前导空白视为缩进信息。括号(圆括号、方括号或花括号)内的语句可以跨多行,此时缩进由括号深度而非前导空白决定。字符串字面量(三引号、单引号)内的空白不能被修改,否则会改变字符串值。
PEP 8 是 Python 的官方风格指南,规定 4 空格缩进、最大行宽 79 字符、运算符两侧加空格、分组导入和命名约定。Black 是无配置格式化器的代表:强制双引号字符串、尾部逗号和 88 字符行宽,规则严格且不可配置。yapf 更接近 Google 风格,支持自定义配置。
- 缩进语义:Python 使用前导空白判断代码块;相同缩进表示同一代码块,缩进变化切换作用域
- PEP 8 规则:4 空格缩进、行宽 79 字符、运算符两侧加空格、类名用 CapWords、函数名用 snake_case
- 括号换行:括号(圆括号、方括号、花括号)内的语句可换行,缩进由括号深度而非前导空白决定
- 字符串边界:三引号字符串和文档字符串内的空白不能修改,否则会破坏字面量内容
- Black 风格:零配置、不可定制、强制双引号、尾部逗号、每行 88 字符,整个项目统一风格
- 类型注解:PEP 484 引入;格式化器保留 -> 返回类型和参数 : 类型注解周围的适当间距
示例
格式化函数定义
输入:def add(a,b):
return a+b
def subtract(a,b):
return a-b
输出:
def add(a, b):
return a + b
def subtract(a, b):
return a - b格式化列表推导式
输入:result=[x*x for x in range(10) if x%2==0]
result2={k:v for k,v in items if v>0}
输出:
result = [x * x for x in range(10) if x % 2 == 0]
result2 = {k: v for k, v in items if v > 0}格式化类定义
输入:class User:
def __init__(self,name,email):
self.name=name
self.email=email
def __repr__(self):
return f"User({self.name})"
输出:
class User:
def __init__(self, name, email):
self.name = name
self.email = email
def __repr__(self):
return f"User({self.name})"常见问题
使用哪种 Python 风格?
大多数版本默认采用 PEP 8 规范,常通过 Black 实现:88 列行宽、双引号字符串、行末无分号。Black 风格强势——它砍掉了大部分配置项,以便在项目中保持一致风格。如需更多灵活性,可以用 autopep8 或 yapf。
缩进对格式化器有影响吗?
有——Python 用缩进定义代码块结构。格式化器会尊重既有的代码块边界;如果输入混用了 Tab 与空格或缩进层级错误,会在格式化前的解析阶段失败。
会修复 import 顺序吗?
Black、autopep8 和 yapf 只处理空白。要排序和分组 import,请使用 isort(或 ruff --fix)。有些页面会把两者结合使用;请查看配置以确认实际应用了什么。
支持类型提示吗?
现代解析器支持。函数签名、变量和类属性上的类型注解(PEP 526、484、612)都能正确格式化。非常新的语法(如 3.12+ 的 PEP 695 泛型语法)需要较新的解析器;旧版本可能会出错。
我的代码会被上传吗?
不会。格式化在浏览器中通过 Python AST 的 JavaScript 实现运行。粘贴的代码不会被传输。
结果会和 CI 上的 Black 一致吗?
接近但未必完全一致。不同 Black 版本的格式化结果可能略有差异(Black 会定期更新规则)。要保证 CI 一致,请在本地和 CI 中使用相同的 Black 版本;本页面更适合作为快速的视觉检查。
为什么会把长行折叠成多行?
PEP 8 和 Black 的目标是每行不超过 88 字符。长表达式、参数较多的函数调用以及链式方法调用会被拆成多行以提升可读性。如果你的团队使用 100 或 120 列,请调整行宽选项。