将Python代码转换为符合PEP8规范的工具

132

我知道有一些工具可以验证你的Python代码是否符合PEP8规范,例如有在线服务Python模块

然而,我找不到一个可以将我的Python文件转换为自包含、符合PEP8规范的Python文件的服务或模块。有人知道是否有这样的工具吗?
我认为这是可行的,因为PEP8关注的是代码的外观,对吧?


1
我认为没有任何工具可以将代码转换为PEP8兼容的代码。PEP8包括变量命名规则,因此,如果存在这样的工具,则它将重命名您的变量名称,您可能无法理解自己的代码。 - Ashwini Chaudhary
1
@AshwiniChaudhary 这是一个很好的观点,值得一提的是,改变变量名可能会影响已经在使用你的代码的其他人,因此这并不总是一个好主意。(autopep8不会这样做。) - Andy Hayden
6个回答

215
你可以使用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:我使用的一种策略是按上面所述运行autopep8,然后运行PEP8,它会打印剩余的违规行为(文件、行号和内容):

pep8 project_dir --ignore=E501

您可以手动逐个更改这些内容(例如,E712s-与布尔值进行比较)。

注意:autopep8提供了一个--aggressive参数(以无情地“修复”这些改变含义的违规),但是如果您使用了aggressive,则可能需要进行调试...(例如,在numpy/pandas中,True == np.bool_(True)但不是True is np.bool_(True)!)

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

pep8 --quiet --statistics .

注意:我认为E501(行太长)是一个特殊情况,因为在您的代码中可能会有很多这些情况,并且有时这些情况不会被autopep8纠正。
例如,我将此技术应用于pandas代码库。

@hayden,你对这个工具的可靠性以及自动修复与引入奇怪问题的比率有什么评论吗? - Marius
@Marius 我在pandas代码上使用了这个(代码相当大),并没有显示出任何奇怪的问题,它不会改变改变含义的代码,我已经更新了我的答案来提到这些。它以前有一个问题是Sphinx的hashbang(现在在PEP8中已经修复了的一个bug)。 - Andy Hayden
2
这是否在评论中执行 Strunk 和 White 的规范? - Eric
1
截至2017年10月25日,此答案中提到的“pep8”软件包已更名为“pycodestyle”:https://github.com/PyCQA/pycodestyle/releases/tag/1.7.1 - hb20007
最大行长对你有用吗? 对我来说不起作用; 例如:autopep8 test.py --in-place --max-line-lengdth=79 - Siebe Albers

43

很遗憾,“pep8 storming”(整个项目)有一些负面影响:

  • 大量合并冲突
  • 破坏git blame
  • 使代码审查困难

作为替代方案(感谢@y-p提供的想法),我编写了一个小型软件包,它只自动调整您上次提交/分支后所修改的行的PEP 8格式:

基本上让项目变得更好比您发现它时更好

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,如果您使用其他工具并希望它能够正常工作,请发布评论/问题/PR

2
非常好的倡议!我正在考虑如何制作一个Notepad++插件来达到同样的目的。因为它是我在Windows上最喜欢的编辑器。 - kmonsoor
1
@kmonsoor 不错的想法,我还没有考虑过编辑器插件!请在 Github 上告诉我任何可以帮助或使其在 CLI 之外更易于使用的方式... 我预见到一些(可解决的)问题。 - Andy Hayden
这里我发现了一个有趣的编辑器插件列表 https://github.com/jcrocholl/pep8/wiki/RelatedTools ,不过对于Notepad++没有什么帮助... - kmonsoor
1
我刚刚创建了一个脚本,用于在Notepad++和Autopep8之间建立桥梁,基于另一个插件"Python Script"。然而,它有效。请在这里检查:http://bit.ly/pep8_tonizer - kmonsoor

9

@Andy Hayden提供了autopep8的良好概述。除此之外,还有一个名为pep8ify的包也可以做同样的事情。

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

little = more[3:   5]

即使经过PEP8格式化,上面的代码仍然相同。但代码看起来还不够好。你可以使用像yapf这样的格式化工具,它可以格式化代码,即使代码符合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 代码!


3
“little = more[3: 5]”是否是PEP8库中的一个错误? yapf 明显在这里是未来趋势,其背后的算法(本质上是在所有格式选项的图中寻找最短路径)是一个非常优雅的解决方案,并且很可能具有更少的错误以及规范的格式。 - Andy Hayden
@AndyHayden 看起来这是一个缺失的功能,它不能修复 E225。 - Chillar Anand

9
我对Python和代码风格的不同工具进行了广泛的研究。有两种类型的工具:linters - 分析您的代码并给出一些关于不良使用代码风格的警告和建议如何修复,以及代码格式化器 - 当您保存文件时,它会使用PEP样式重新格式化您的文档。
因为重新格式化必须更加准确 - 如果重新格式化了您不想改变的内容,就会变得无用 - 它们覆盖了PEP的较少部分,而linters则显示了更多内容。
所有这些工具都有不同的配置权限 - 例如,pylinter可以在其所有规则中进行配置(您可以打开/关闭每种类型的警告),black则无法进行任何配置。
以下是一些有用的链接和教程:
文档: - PEP-257 Docstring约定:https://www.python.org/dev/peps/pep-0257/ - PEP-484 类型提示:https://www.python.org/dev/peps/pep-0484 - Chromium风格指南:https://chromium.googlesource.com/chromiumos/docs/+/master/styleguide/python.md - autotest的代码风格:https://chromium.googlesource.com/chromiumos/third_party/autotest/+/master/docs/coding-style.md - Khan Academy编码风格指南:https://github.com/Khan/style-guides/blob/master/style/python.md - The hitchhiker's Guide to Python:https://docs.python-guide.org/ - EdX Python风格指南:https://edx.readthedocs.io/projects/edx-developer-guide/en/latest/style_guides/python-guidelines.html - RealPython上的代码风格文章:https://realpython.com/python-pep8/ Linters(按照受欢迎程度排序):

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


1
pytype 也是一种流行的代码检查工具。 - Sadman Sakib

6
如果您正在使用eclipse + PyDev,您可以从PyDev的设置中轻松启用autopep8:Windows -> Preferences -> 在搜索过滤器中键入“autopep8”。 选择“use autopep8.py for code formatting?”选项,然后点击“OK”。 现在,eclipse的CTRL-SHIFT-F代码格式化应该使用autopep8格式化您的代码 :)

3

有很多种。

IDE通常内置一些格式化功能。IntelliJ Idea / PyCharm有,Eclipse的Python插件也有,等等。

有格式化程序/代码检查工具可以针对多种语言。https://coala.io就是这样一个很好的例子。

然后还有单一用途的工具,在其他答案中提到了许多。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接