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

问题描述 投票:97回答:5

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

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

python coding-style pep8
5个回答
35
投票

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

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

作为一种替代方法(并且感谢@y-p for the idea),我编写了一个小包,其中autopep8只包含自上次提交/分支以来您一直在处理的那些行:

Basically leaving the project a little 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


171
投票

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

通过pip安装:

pip install autopep8

将其应用于特定文件:

autopep8 py_file --in-place

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

autopep8 project_dir --recursive --in-place --pep8-passes 2000 --verbose

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

At this point I suggest retesting and doing a commit!

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

pep8 project_dir --ignore=E501

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

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

You can check how many violations of each type (before and after):

pep8 --quiet --statistics .

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

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


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

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


3
投票

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

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

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


1
投票

有许多。

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.