将 Python 代码转换为与 PEP8兼容的工具

我知道有些工具可以验证 Python 代码是否与 PEP8兼容,例如 网上服务一个巨蟒模块

但是,我找不到一个服务或模块,它可以 改变信仰我的 Python 文件到一个自包含的,PEP8有效的 Python 文件。有人知道有没有吗?
我认为这是可行的,因为 PEP8完全是关于代码的外观,对吗?

98515 次浏览

你可以使用 Autopep8!当你给自己泡一杯咖啡的时候,这个工具会很高兴地移除所有那些讨厌的 PEP8违规行为,这些违规行为不会改变代码的 意义

通过 pip 安装:

pip install autopep8

将其应用于特定文件:

autopep8 py_file --in-place

或你的项目(递归) ,详细的选项会给你一些关于进展的反馈:

autopep8 project_dir --recursive --in-place --pep8-passes 2000 --verbose

注意: 有时候默认的100次传递是不够的,我将它设置为2000,因为它是合理的高,将捕获所有的,但最麻烦的文件(它停止传递,一旦它发现没有可解决的 pep8违规行为) ..。

此时,我建议重新测试并执行提交操作!

如果您希望遵循 “满” PEP8: 我使用的一种策略是像上面那样运行 autoopep8,然后运行 PEP8,它将打印其余的违规行为(文件、行号和内容) :

pep8 project_dir --ignore=E501

并手动更改这些单独(例如 E712s-与布尔值比较)。

注意: autopep8提供了一个 --aggressive参数(用来无情地“修复”这些改变意义的违规行为) ,但是要注意,如果你使用侵略性,你可能不得不调试... (例如,在 numpy/Pandas True == np.bool_(True)中,而不是在 True is np.bool_(True)中!)

您可以检查每种类型的违规次数(之前和之后) :

pep8 --quiet --statistics .

注意: 我认为 E501(行太长)是一个特例,因为在您的代码中可能会有很多这样的代码,有时这些代码没有被 autopep8纠正。

作为示例,我将 应用了这个技术应用到 熊猫代码库中。

不幸的是,“ pep8风暴”(整个项目)有几个负面的副作用:

  • 很多合并冲突
  • 打破基特责备
  • 使代码检查变得困难

作为一个替代方案(感谢 @ y-p for the idea) ,我编写了一个小程序包,只对自上次提交/分支以来一直在处理的代码行执行 autoopep8:

基本上给项目留下了一点点。 比你找到的要好:

pip install pep8radius

假设您已经在 master之外完成了工作并准备提交:

# be somewhere in your project directory
# see the diff with pep, see the changes you've made since master
pep8radius master --diff
# make those changes
pep8radius master --diff --in-place

或者清理自上次提交以来提交的新行:

pep8radius --diff
pep8radius --diff --in-place


# the lines which changed since a specific commit `git diff 98f51f`
pep8radius 98f51f --diff

基本上,pep8radius将 autopep8应用于 git/hg diff (来自 最后一次共享提交)输出中的行。

这个脚本目前与 git 和 hg 一起工作,如果您使用其他东西,并希望这个工作 请发表评论/问题/公关

如果你正在使用 eclipse + PyDev,你可以简单地从 PyDev 的设置中激活 autopep8: Windows-> Preferences-> 在搜索过滤器中键入‘ autopep8’。

检查“ use autopep8.py for code format?”-> OK

现在 Eclipse 的 CTRL-SHIFT-F 代码格式应该使用 autopep8:)格式化代码

screen shot

@ Andy Hayden 对 autopep8做了很好的概述。除此之外,还有一个叫做 Pep8ify的软件包,它也做同样的事情。

然而,这两个包都只能删除 lint 错误,但不能格式化代码。

little = more[3:   5]

上面的代码也经过胡椒化后仍然是一样的。但是代码看起来还不太好。您可以使用像 没错这样的格式化程序,即使代码符合 PEP8,它也会格式化代码。 以上代码将被格式化为

little = more[3:5]

有时这甚至会破坏您的手动格式

BAZ = {
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
}

将被转换为

BAZ = {[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]}

但是你可以告诉它忽略一些部分。

BAZ = {
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
}  # yapf: disable

摘自我以前的博文: 自动 PEP8 & 格式化您的 Python 代码!

有很多。

IDE 通常内置一些格式化功能。IntelliJ Ideas/PyCharm 可以做到这一点,Eclipse 的 Python 插件也可以做到这一点,等等。

有一些格式化程序/行程序可以针对多种语言,https://coala.io就是一个很好的例子。

然后是单一目的工具,其中许多在其他答案中提到。

自动重新格式化的一种特定方法是将文件解析为 AST 树(不删除注释) ,然后将其转储回文本(这意味着原始格式没有保留)。例如 https://github.com/python/black

我对 Python 的不同工具和代码风格进行了广泛的研究。 有两种类型的工具: 分析你的代码,给出一些关于糟糕使用的代码样式的警告,并显示建议如何修复它,和代码格式化程序,当你保存文件时,它重新格式化你的文档使用 PEP 样式。

因为重新格式化必须更加精确——如果它重新格式化了一些您不希望它变得无用的东西——它们覆盖的 PEP 部分更少,行符显示的更多。

它们都有不同的配置权限——例如,pylinter 的所有规则都是可配置的(可以打开/关闭每种警告) ,黑色的根本不可配置。

下面是一些有用的链接和教程:

文件:

Linters (按受欢迎程度排序) :

代码格式化程序(按受欢迎程度排序) :