autopep8 自动格式化 Python 代码以符合 PEP 8 风格指南。它使用 pycodestyle 实用程序来确定代码的哪些部分需要格式化。 autopep8 能够修复 pycodestyle 报告的大多数格式问题。
内容
pkg_resources.DistributionNotFound
来自点:
$ pip install --升级 autopep8
考虑使用--user
选项。
autopep8 需要 pycodestyle。
要就地修改文件(使用激进级别 2):
$ autopep8 --in-place --aggressive --aggressive <文件名>
在运行 autopep8 之前。
import math , sys ;
def example1 ():
####This is a long comment. This should be wrapped to fit within 72 characters.
some_tuple = ( 1 , 2 , 3 , 'a' );
some_variable = { 'long' : 'Long code lines should be wrapped within 79 characters.' ,
'other' :[ math . pi , 100 , 200 , 300 , 9876543210 , 'This is a long string that goes on' ],
'more' :{ 'inner' : 'This whole logical line should be wrapped.' , 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 ):
#Comments should have a space after the hash.
if bar : bar += 1 ; bar = bar * bar ; return bar
else :
some_string = """
Indentation in multiline strings should not be touched.
Only actual code should be reindented.
"""
return ( sys . path , some_string )
运行 autopep8 后。
import math
import sys
def example1 ():
# This is a long comment. This should be wrapped to fit within 72
# characters.
some_tuple = ( 1 , 2 , 3 , 'a' )
some_variable = {
'long' : 'Long code lines should be wrapped within 79 characters.' ,
'other' : [
math . pi ,
100 ,
200 ,
300 ,
9876543210 ,
'This is a long string that goes on' ],
'more' : {
'inner' : 'This whole logical line should be wrapped.' ,
some_tuple : [
1 ,
20 ,
300 ,
40000 ,
500000000 ,
60000000000000000 ]}}
return ( some_tuple , some_variable )
def example2 (): return ( '' in { 'f' : 2 }) in { 'has_key() is deprecated' : True }
class Example3 ( object ):
def __init__ ( self , bar ):
# Comments should have a space after the hash.
if bar :
bar += 1
bar = bar * bar
return bar
else :
some_string = """
Indentation in multiline strings should not be touched.
Only actual code should be reindented.
"""
return ( sys . path , some_string )
选项:
用法:autopep8 [-h] [--版本] [-v] [-d] [-i] [--全局配置文件名] [--忽略本地配置] [-r] [-jn] [-pn] [-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 -jn, --jobs n 个并行作业;如果值为,则匹配 CPU 计数 小于 1 -pn, --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: off
[
[ 23 , 23 , 13 , 43 ],
[ 32 , 34 , 34 , 34 ],
[ 56 , 34 , 34 , 11 ],
[ 10 , 10 , 10 , 10 ],
]
# autopep8: on
fmt: off
和fmt: on
也有效。
使用 autopep8 作为模块的最简单方法是通过fix_code()
函数:
>>> import autopep8 >>> autopep8.fix_code( ' x= 123 n ' ) 'x = 123n'
或者使用选项:
>>> import autopep8 >>> autopep8.fix_code( ' print( 123 ) n ' , ... options = { ' ignore ' : [ ' E ' ]}) 'print( 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 添加为插件,请将此存储库定义添加到您的配置中:
repos :
- repo : https://github.com/hhatto/autopep8
rev : ... # select the tag or revision you want, or run `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
。