【问题标题】:Tool to convert Python code to be PEP8 compliant将 Python 代码转换为符合 PEP8 的工具
【发布时间】:2012-12-29 00:01:18
【问题描述】:

我知道有一些工具可以验证您的 Python 代码是否符合 PEP8,例如 an online servicea python module

但是,我找不到可以将我的 Python 文件转换为独立的 PEP8 有效 Python 文件的服务或模块。有谁知道有没有?
我认为这是可行的,因为 PEP8 就是关于代码的外观,对吧?

【问题讨论】:

  • 我认为没有任何工具可以将代码转换为 PEP8 兼容代码。 PEP8 也包含变量命名规则,因此,如果存在这样的工具,那么它也会重命名您的变量名称,您可能无法理解您自己的代码。
  • @AshwiniChaudhary 说得很好,还值得一提的是,更改变量名可能会影响已经在使用您的代码的其他人,因此这并不总是一个好主意。 (autopep8 不这样做。)

标签: python coding-style pep8


【解决方案1】:

您可以使用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 参数(无情地“修复”这些改变含义的违规行为),但请注意,如果您确实使用积极的,您可能必须调试......(例如在 numpy/pandas @ 987654330@ 但不是True is np.bool_(True)!)

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

pep8 --quiet --statistics .

注意:我认为 E501(行太长)是一种特殊情况,因为您的代码中可能会有很多这样的问题,有时这些问题不会被 autopep8 纠正。

作为一个例子,我将applied this 技术添加到pandas 代码库中。

【讨论】:

  • @hayden 你有任何关于这有多可靠,以及自动修复与它引入的奇怪问题的比例吗?
  • @Marius 我在 pandas 代码(相当大)上使用了它,它没有显示任何奇怪的问题,它不会改变改变 含义的代码,我已经更新了我的答案以提及这些。它之前在 Sphinx 的 hashbang 上存在问题(现在修复了 PEP8 中的一个错误)。
  • 这会在 cmets 中强制执行 Strunk 和 White 吗?
  • 截至 2017 年 10 月 25 日,此答案中提到的 pep8 包已重命名为 pycodestyle:github.com/PyCQA/pycodestyle/releases/tag/1.7.1
  • 最大行长对你有用吗?对我来说不是;例如:autopep8 test.py --in-place --max-line-lengdth=79
【解决方案2】:

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

  • 很多合并冲突
  • 打破 git 责备
  • 让代码审查变得困难

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

基本上离开项目一点 better than you found it:

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 输出中的行(来自 the last shared commit)。

此脚本目前可与 git 和 hg 一起使用,如果您使用其他东西并希望它能够正常工作please post a comment/issue/PR

【讨论】:

  • +1 非常好的倡议......我正在考虑如何制作一个用于相同目的的 Notepad++ 插件......因为这是我在 Windows 上最喜欢的编辑器
  • @kmonsoor 好主意,我没想到编辑器插件!在 github 上让我知道任何我可以提供帮助/使 CLI 之外更易于使用的方式...我预见到一些(可解决的)问题。
  • 在这里我找到了一个有趣的编辑器插件列表github.com/jcrocholl/pep8/wiki/RelatedTools,虽然 Notepad++ 没有运气...
  • 我刚刚创建了一个脚本来连接 Notepad++ 和 Autopep8,基于另一个插件“Python Script”。但是,它有效。请在这里查看:bit.ly/pep8_tonizer
【解决方案3】:

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

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

little = more[3:   5]

上面的代码在 pep8ifying 之后也保持不变。但是代码看起来还不是很好。您可以使用像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

摘自我的旧博文:Automatically PEP8 & Format Your Python Code!

【讨论】:

  • little = more[3: 5] 是 pep8(库)中的错误吗? yapf 绝对是这里的未来,它背后的算法(本质上是所有格式选项图中的最短路径)是一个非常优雅的解决方案,并且可能会有更少的错误和规范格式。
  • @AndyHayden 看起来这是一个缺失的功能,它不能修复 E225
【解决方案4】:

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

因为重新格式化必须更准确 - 如果它重新格式化您不希望它变得无用的东西 - 它们涵盖的 PEP 部分更少,而 linter 显示更多。

它们都具有不同的配置权限 - 例如,pylinter 可在其所有规则中配置(您可以打开/关闭每种类型的警告),黑色根本无法配置。

这里有一些有用的链接和教程:

文档:

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

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

【讨论】:

  • pytype 也是一个流行的 linter。
【解决方案5】:

如果您使用的是 eclipse + PyDev,您可以简单地从 PyDev 的设置中激活 autopep8: Windows -> 首选项 -> 在搜索过滤器中输入“autopep8”。

勾选“使用 autopep8.py 进行代码格式化?” -> 好的

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

【讨论】:

    【解决方案6】:

    有很多。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-04-08
      • 2015-08-02
      • 1970-01-01
      • 2010-10-06
      • 1970-01-01
      • 1970-01-01
      • 2010-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多