127

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

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

4

6 回答 6

202

您可以使用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/pandasTrue == np.bool_(True)但不是True is np.bool_(True)!)

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

pep8 --quiet --statistics .

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

例如,我将这种技术应用于pandas代码库。

于 2013-01-14T23:09:23.140 回答
41

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

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

作为替代方案(感谢@yp 的想法),我编写了一个小包,其中 autopep8s 仅包含自上次提交/分支以来您一直在处理的那些行:

基本上离开项目 比你发现它好一点

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,如果您使用其他东西并希望它工作,请发表评论/问题/公关

于 2014-03-26T08:38:10.257 回答
8

@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

摘自我的旧博文:自动 PEP8 并格式化您的 Python 代码!

于 2015-05-26T14:11:24.607 回答
6

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

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

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

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

文档:

短绒(按受欢迎程度排序):

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

于 2020-02-04T08:03:49.630 回答
5

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

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

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

截屏

于 2015-04-05T10:24:26.687 回答
1

有许多。

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

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

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

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

于 2017-09-21T11:11:28.597 回答