autopep8 自动格式化 Python 代码以符合 PEP 8 风格指南。它使用 pycodestyle 实用程序来确定代码的哪些部分需要格式化。 autopep8 能够修复 pycodestyle 报告的大多数格式问题。
内容
安装
要求
用法
特征
更高级的用法
逐行禁用
作为模块使用
配置
pyproject.toml
与预提交一起使用
测试
故障排除
pkg_resources.DistributionNotFound
链接
来自点:
$ pip install --升级 autopep8
考虑使用--user
选项。
autopep8 需要 pycodestyle。
要就地修改文件(使用激进级别 2):
$ autopep8 --in-place --aggressive --aggressive <文件名>
在运行 autopep8 之前。
import math, sys;def example1():####这是一个很长的注释。应将其换行以适合 72 个字符。some_tuple=( 1,2, 3,'a' );some_variable={'long':'长代码行应在 79 个字符内换行。','other':[math .pi, 100,200,300,9876543210,'这是一串长长的字符串'],'more':{'inner':'这整个逻辑行应该被换行。',some_tuple:[1,20,300,40000,500000000,60000000000000000]}}return (some_tuple, some_variable)def example2(): return {'has_key() is deprecated':True}.has_key({'f':2}.has_key(''));class Example3( object ):def __init__ ( self, bar ): #注释在散列后面应该有一个空格。如果条:条+=1; 条=条*条; return bar else:some_string = """ 不应修改多行字符串中的缩进。仅应重新缩进实际代码。"""return (sys.path, some_string)
运行 autopep8 后。
import mathimport sysdef example1():# 这是一个很长的注释。应将其包装在 72# 个字符内。some_tuple = (1, 2, 3, 'a')some_variable = {'long': '长代码行应包装在 79 个字符内。','other': [math .pi,100,200,300,9876543210,'这是一个很长的字符串'],'more': {'inner': '这个整个逻辑行应该被包装。',some_tuple: [1,20,300,40000,500000000,60000000000000000]}}return (some_tuple, some_variable)def example2(): return ('' in {'f': 2}) in { 'has_key() 已弃用': True}class Example3(object):def __init__(self, bar):# 注释在 hash 后应该有一个空格。if bar:bar += 1bar = bar * barreturn barelse:some_string = """ 不应触及多行字符串中的缩进。仅应重新缩进实际代码。"""return (sys.path, some_string)
选项:
用法:autopep8 [-h] [--版本] [-v] [-d] [-i] [--全局配置文件名] [--ignore-local-config] [-r] [-j n] [-p n] [-a] [--实验] [--排除 glob] [--list-fixes] [--忽略错误] [--选择错误] [--最大行长度n] [--line-range 行 行] [--hang-close] [--exit-code] [文件[文件...]] 自动格式化 Python 代码以符合 PEP 8 风格指南。 位置参数: 文件 要格式化的文件或“-”表示标准 可选参数: -h, --help 显示此帮助消息并退出 --version 显示程序的版本号并退出 -v, --verbose 打印详细消息;多个 -v 会产生更多 详细消息 -d, --diff 打印固定源的差异 -i, --in-place 对文件进行适当的更改 --全局配置文件名 全局 pep8 配置文件的路径;如果这个文件有 不存在则忽略(默认值: 〜/.config/pep8) --忽略本地配置 不要查找并应用本地配置文件;如果不 通过,默认值将使用中的任何配置文件进行更新 项目的根目录 -r, --recursive 在目录上递归运行;必须与 --in-place 或 --diff -j n, --jobs n 并行作业数量;如果值为,则匹配 CPU 计数 小于 1 -p n, --pep8-passes n 额外 pep8 传递的最大数量(默认值: 无限) -a, --aggressive 启用非空白更改;多个 -a 结果为 更激进的改变 --experimental 启用实验性修复 --exclude globs 排除与这些逗号匹配的文件/目录名称- 分离的球体 --list-fixes 列出修复代码;由 --ignore 和 --select 使用 --ignore errors 不会修复这些错误/警告(默认值: E226、E24、W50、W690) --select错误仅修复这些错误/警告(例如E4,W) --max-line-length n 设置允许的最大行长度(默认值:79) --line-range 线 线, --range 线 线 仅修复在此包含范围内发现的错误 行号(例如 1 99);行号索引于 1 --hang-close 挂起关闭选项传递给 pycodestyle --exit-code 更改退出代码的行为。默认行为 返回值,0为无差异,1为错误退出。 添加此选项时返回2。 2 存在 差异。
autopep8 修复了 pycodestyle 报告的以下问题:
E101 - 重新缩进所有行。 E11 - 修复缩进。 E121 - 将缩进修复为四的倍数。 E122 - 为悬挂缩进添加缺失的缩进。 E123 - 将右括号与左括号对齐。 E124 - 对齐右括号以匹配视觉缩进。 E125 - 缩进以区分行与下一个逻辑行。 E126 - 修复过度缩进的悬挂缩进。 E127 - 修复视觉凹痕。 E128 - 修复视觉凹痕。 E129 - 修复视觉凹痕。 E131 - 修复未对齐连续线的悬挂缩进。 E133 - 修复闭合支架缺失的缩进。 E20 - 删除无关的空白。 E211 - 删除无关的空格。 E22 - 修复关键字周围的无关空白。 E224 - 删除运算符周围的无关空白。 E225 - 修复运算符周围缺失的空格。 E226 - 修复算术运算符周围缺失的空格。 E227 - 修复按位/移位运算符周围缺失的空格。 E228 - 修复模运算符周围缺失的空格。 E231 - 添加缺失的空格。 E241 - 修复关键字周围的无关空白。 E242 - 删除运算符周围的无关空白。 E251 - 删除参数“=”符号周围的空格。 E252 - 参数 equals 周围缺少空格。 E26 - 修复内联注释的注释哈希后的间距。 E265 - 修复块注释的注释哈希后的间距。 E266 - 修复块注释中过多的前导“#”。 E27 - 修复关键字周围的无关空白。 E301 - 添加缺失的空行。 E302 - 添加缺失的 2 个空行。 E303 - 删除多余的空行。 E304 - 删除函数装饰器后面的空行。 E305 - 函数或类结束后预计有 2 个空行。 E306 - 嵌套定义前应有 1 个空行。 E401 - 将导入放在单独的行上。 E402 - 修复模块级导入不在文件顶部的问题 E501 - 尝试使行适合 --max-line-length 字符。 E502 - 删除换行符的无关转义。 E701 - 将冒号分隔的复合语句放在单独的行上。 E70 - 将分号分隔的复合语句放在单独的行上。 E711 - 修复与 None 的比较。 E712 - 修复与布尔值的比较。 E713 - 使用“不在”进行成员资格测试。 E714 - 使用“不是”测试来确定对象身份。 E721 - 使用“isinstance()”而不是直接比较类型。 E722 - 修复裸露的情况除外。 E731 - 使用 def 时不分配 lambda 表达式。 W291 - 删除尾随空格。 W292 - 在文件末尾添加一个换行符。 W293 - 删除空行上的尾随空格。 W391 - 删除尾随空白行。 W503 - 修复二元运算符之前的换行符。 W504 - 修复二元运算符后的换行符。 W605 - 修复无效的转义序列“x”。
autopep8 还修复了 pycodestyle 未发现的一些问题。
规范化具有混合行结尾的文件。
在类文档字符串与其第一个方法声明之间放置一个空行。 (通过E301
启用。)
删除函数声明及其文档字符串之间的空行。 (通过E303
启用。)
autopep8 避免修复 pycodestyle 发现的一些问题。
非注释的E112
/ E113
是违反语法规则的错误缩进的报告。这些根本不应该修改。
E265
指的是注释哈希后的空格,如果注释看起来像代码,则将被忽略。 autopep8 避免修改这些,因为它们不是真正的注释。如果您确实想摆脱 pycodestyle 警告,请考虑删除注释掉的代码。 (这可以通过根除来自动化。)
默认情况下,autopep8 仅进行空白更改。因此,默认情况下,它不会修复E711
和E712
。 (如果x
重写了__eq__
方法,则将x == None
更改为x is None
可能会更改程序的含义。)它也不会更正已弃用的代码W6
。要启用这些更积极的修复,请使用--aggressive
选项:
$ autopep8 --aggressive <文件名>
使用多个--aggressive
来提高攻击性级别。例如, E712
需要攻击性级别 2(因为x == True
可以更改为x
或x is True
,但 autopep8 选择前者)。
--aggressive
也会更积极地缩短线路。它还会更积极地删除尾随空白。 (通常,我们不会触及文档字符串和其他多行字符串中的尾随空格。要对文档字符串进行更积极的更改,请使用 docformatter。)
要仅启用修复的子集,请使用--select
选项。例如,要修复各种类型的缩进问题:
$ autopep8 --select=E1,W1 <文件名>
如果要修复的文件很大,您可能需要启用详细的进度消息:
$ autopep8 -v <文件名>
传入--experimental
可以启用以下功能:
通过考虑代码行的长度来缩短代码行
$ autopep8 --experimental <文件名>
可以禁用 autopep8,直到在文件中再次打开它,使用autopep8: off
然后使用autopep8: on
重新启用。
# autopep8: 关闭[ [23,23,13,43], [32,34,34,34], [56,34,34,11], [10, 10, 10, 10], ]# autopep8: 开启
fmt: off
和fmt: on
也有效。
使用 autopep8 作为模块的最简单方法是通过fix_code()
函数:
>>> 导入 autopep8 >>> autopep8.fix_code('x= 123n') 'x = 123n'
或者使用选项:
>>> 导入 autopep8 >>> autopep8.fix_code('print( 123 )n', ...选项={'忽略': ['E']}) '打印(123)n'
默认情况下,如果$HOME/.config/pycodestyle
(Windows环境下为~.pycodestyle
)存在,则将其用作全局配置文件。或者,您可以使用--global-config
选项指定全局配置文件。
另外,如果目标文件所在目录中存在setup.cfg
、 tox.ini
、 .pep8
和.flake8
文件,则它将用作配置文件。
pep8
、 pycodestyle
和flake8
可以用作一个部分。
配置文件示例:
[pycode风格] 最大行长度 = 120 忽略=E501
autopep8 还可以使用pyproject.toml
。该部分必须是[tool.autopep8]
,并且pyproject.toml
优先于任何其他配置文件。
配置文件示例:
[工具.autopep8] 最大行长度 = 120 忽略 = "E501,W6" # 或 ["E501", "W6"] 就地=真 递归=真 攻击性 = 3
autopep8 可以用作预提交的钩子。
要将 autopep8 添加为插件,请将此存储库定义添加到您的配置中:
回购协议: - repo: https://github.com/hhatto/autopep8rev: ... # 选择你想要的标签或版本,或者运行`pre-commit autoupdate`hooks: - ID:autopep8
测试用例位于test/test_autopep8.py
中。它们可以直接通过python test/test_autopep8.py
或通过 tox 运行。后者对于针对多个 Python 解释器进行测试非常有用。 (我们目前针对 CPython 版本 3.8、3.9、3.10、3.11 和 3.12 进行测试。我们还针对 PyPy 进行测试。)
通过test/acid.py
可以进行广谱测试。此脚本针对 Python 代码运行 autopep8 并检查代码修复的正确性和完整性。它可以检查字节码是否保持相同。 test/acid_pypi.py
使用acid.py
来测试 PyPI 上最新发布的软件包。
pkg_resources.DistributionNotFound
如果您使用的是旧版本的setuptools
,则在尝试运行autopep8
时可能会遇到pkg_resources.DistributionNotFound
。尝试升级setuptools
以解决此setuptools
问题:
$ pip install --升级安装工具
如果要安装到系统,请使用sudo
。
皮伊
GitHub
代码科夫