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


113

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

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


1
我认为没有任何工具可以将代码转换为PEP8兼容代码。PEP8还包括变量命名规则,因此,如果存在这样的工具,则它也会重命名您的变量名称,然后您可能无法理解自己的代码。
Ashwini Chaudhary

1
@AshwiniChaudhary这是一个很好的观点,值得一提的是,更改变量名称可能会影响已经使用您的代码的其他人,因此这并不总是一个好主意。(autopep8不会执行此操作。)
Andy Hayden

Answers:


38

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

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

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

基本上使项目 比您发现的要好

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输出中的行(来自最后一个共享commit)。

该脚本当前可与git和hg一起使用,如果您使用其他方法并希望它起作用,请发表评论/问题/ PR


2
+1很好的主动性...我正在考虑如何出于相同的目的制作Notepad ++插件...那是我在Windows上最喜欢的编辑器
kmonsoor 2014年

1
@kmonsoor好主意,我还没有想到编辑器插件!我可以在github上让我知道的任何我可以在CLI之外提供帮助/使其更易于使用的方式...我预见了一些(可解决的)问题。
安迪·海登2014年

在这里,我发现了一个有趣的编辑器插件列表github.com/jcrocholl/pep8/wiki/RelatedTools,尽管Notepad ++没有运气……
kmonsoor 2014年

1
我刚刚基于另一个插件“ Python Script”创建了一个脚本在Notepad ++和Autopep8之间架桥。但是,它起作用。请在这里检查:bit.ly/pep8_tonizer
kmonsoor 2014年

184

您可以使用autopep8!在您自己泡杯咖啡的同时,该工具会愉快地删除所有那些不会改变代码含义的讨厌的PEP8违规行为。

通过pip安装它:

pip install autopep8

将此应用到特定文件:

autopep8 py_file --in-place

或对您的项目(递归地),verbose选项为您提供了一些进展的反馈

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中,True == np.bool_(True)但不能True is np.bool_(True)!)

您可以检查每种类型(前后)有多少次违规:

pep8 --quiet --statistics .

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

例如,我将此技术应用于了熊猫代码库。


@hayden您对它的可靠性以及它引入的自动修复与怪异问题的比率有何评论?
Marius 2013年

@Marius我在熊猫代码(相当大)上使用了它,它没有显示任何奇怪的问题,它不会更改会改变含义的代码,我已经更新了答案以提及这些。以前它与Sphinx的hashbang有关(现在已修复PEP8中的一个错误)。
安迪·海登

2
这会在评论中强制使用Strunk和White吗?
埃里克

1
截至2017年10月25日,pep8此答案中提及的软件包已重命名为pycodestylegithub.com/PyCQA/pycodestyle/releases/tag/1.7.1
hb20007

8

@Andy Hayden很好地概述了autopep8。除此之外,还有一个名为pep8ify的软件包,它也可以执行相同的操作。

但是,这两个软件包都只能消除棉绒错误,但不能格式化代码。

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代码!


2
little = more[3: 5]pep8(程式库)中的错误吗?yapf绝对是这里的未来,其背后的算法(本质上是所有格式化选项中最短的路径)是一个非常优雅的解决方案,并且可能会有更少的错误以及规范的格式化。
安迪·海登

@AndyHayden看起来这是一个缺少的功能,它无法修复E225
ChillarAnand

5

如果您使用的是eclipse + PyDev,则只需从PyDev的设置中激活autopep8:Windows-> Preferences->在搜索过滤器中键入'autopep8'。

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

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

屏幕截图


3

我对python和代码风格的不同工具进行了广泛的研究。有两种类型的工具:linters-分析您的代码并给出有关错误使用的代码样式的警告并显示有关如何修复它的建议,以及code formatter-在保存文件时,它将使用PEP样式重新设置文档格式。

因为重新格式化必须更加准确-如果重新格式化您不希望的内容变得无用-它们覆盖的PEP所占比例较小,因此棉绒显示的更多。

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

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

说明文件:

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

代码格式化程序(按流行程度排序):


1

有许多。

IDE通常具有一些内置的格式化功能。IntelliJ Idea / PyCharm确实具有这种功能,Eclipse的Python插件也是如此,依此类推。

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.