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

Che*_*Xie 104 python coding-style pep8

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

但是,我找不到可以我的Python文件转换为自包含的PEP8有效Python文件的服务或模块.有谁知道有没有?
我认为这是可行的,因为PEP8完全是关于代码的外观,对吗?

And*_*den 173

你可以使用autopep8!虽然你自己做了一杯咖啡,但这个工具很乐意删除所有那些不会改变代码含义的那些讨厌的PEP8违规行为.

通过pip安装:

pip install autopep8
Run Code Online (Sandbox Code Playgroud)

将其应用于特定文件:

autopep8 py_file --in-place
Run Code Online (Sandbox Code Playgroud)

或者对你的项目(递归),详细选项会给你一些反馈:

autopep8 project_dir --recursive --in-place --pep8-passes 2000 --verbose
Run Code Online (Sandbox Code Playgroud)

注意:有时默认100次通过是不够的,我将它设置为2000,因为它相当高并且将捕获除了最麻烦的文件之外的所有文件(一旦找不到可解析的pep8违规就停止传递)...

此时我建议重新测试并做出提交!

如果你想要"完整"的 PEP8合规性:我使用的一种策略是运行如上所述的autopep8,然后运行PEP8,它会打印剩余的违规(文件,行号和内容):

pep8 project_dir --ignore=E501
Run Code Online (Sandbox Code Playgroud)

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

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

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

pep8 --quiet --statistics .
Run Code Online (Sandbox Code Playgroud)

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

作为一个例子,我将这种技术应用于pandas代码库.

  • 这是否在评论中强制执行 Strunk 和 White? (2认同)

And*_*den 35

不幸的是,"pep8 storming"(整个项目)有几个负面的副作用:

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

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

基本上让项目 比你发现它好一点:

pip install pep8radius
Run Code Online (Sandbox Code Playgroud)

假设你完成了你的工作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
Run Code Online (Sandbox Code Playgroud)

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

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

# the lines which changed since a specific commit `git diff 98f51f`
pep8radius 98f51f --diff
Run Code Online (Sandbox Code Playgroud)

基本上pep8radius是将autopep8应用于git/hg diff输出中的行(来自上次共享提交).

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

  • +1非常好的主动...我正在考虑如何为同一目的制作Notepad ++插件...因为这是我在Windows上最喜欢的编辑器 (2认同)

Chi*_*and 8

@Andy Hayden对autopep8给出了很好的概述.除此之外,还有一个名为pep8ify的软件包也可以做同样的事情.

但是,这两个软件包只能删除lint错误,但它们无法格式化代码.

little = more[3:   5]
Run Code Online (Sandbox Code Playgroud)

在pep8ifying之后,上面的代码保持不变.但是代码看起来并不好看.您可以使用像yapf这样的格式化程序,即使代码符合PEP8,它也会格式化代码.上面的代码将被格式化为

little = more[3:5]
Run Code Online (Sandbox Code Playgroud)

有时这甚至会破坏您的手动格式化.例如

BAZ = {
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12]
}
Run Code Online (Sandbox Code Playgroud)

将被转换为

BAZ = {[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]}
Run Code Online (Sandbox Code Playgroud)

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

BAZ = {
   [1, 2, 3, 4],
   [5, 6, 7, 8],
   [9, 10, 11, 12]
}  # yapf: disable
Run Code Online (Sandbox Code Playgroud)

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

  • 是'little = more [3:5]`pep8(库)中的一个错误?yapf绝对是这里的未来,它背后的算法(基本上是所有格式化选项图中的最短路径)是一个非常优雅的解决方案,并且可能会有更少的错误以及规范格式. (2认同)

mor*_*ork 5

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

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

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

截屏


Mik*_*Sam 5

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

因为重新格式化必须更准确 - 如果它重新整理了一些你不希望它变得无用的东西 - 它们覆盖的 PEP 部分较少,短绒显示更多。

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

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

文档:

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

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