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

时间:2013-01-14 23:01:32

标签: python coding-style pep8

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

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

6 个答案:

答案 0 :(得分:165)

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

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

pep8 --quiet --statistics .

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

例如,我applied this代码库的pandas技术。

答案 1 :(得分:32)

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

  • 许多合并冲突
  • break git blame
  • 使代码审核变得困难

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

基本上离开项目 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

答案 2 :(得分:8)

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

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

31\/1\1\dd

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

1000px

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

#fixedBox {
    position: fixed;
    left: 50%;
    /* move it back half the width of your mainWrapper */
    margin-left: -500px;
}

@media screen and (max-width: 999px) {
    #fixedBox {
        left: 0;
        margin-left: 0;
    }
}

将转换为

little = more[3:   5]

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

little = more[3:5]

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

答案 3 :(得分:3)

如果你正在使用eclipse + PyDev,你只需从PyDev的设置中激活autopep8: Windows - >偏好 - >输入' autopep8'在搜索过滤器中。

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

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

screen shot

答案 4 :(得分:3)

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

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

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

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

文档:

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

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

答案 5 :(得分:1)

有很多。

IDE通常内置一些格式化功能.IntelliJ Idea / PyCharm也适用于Eclipse的Python插件,依此类推。

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

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

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