将Python代码转换为PEP8 complian的工具

2024-05-19 00:42:37 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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


Tags: 模块文件工具代码anserviceonline外观
3条回答

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

但是,这两个包只能删除lint错误,但不能格式化代码。

little = more[3:   5]

上面的代码在pep8ify之后也保持不变。但代码看起来还不太好。您可以使用像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!

你可以用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违规,它将停止传递)。。。

在这一点上,我建议重新测试和做一个承诺!

如果您想“full”PEP8合规性:我使用的一种策略是如上所述运行autopep8,然后运行PEP8,它将打印剩余的违规行为(文件、行号和什么):

pep8 project_dir --ignore=E501

并分别手动更改(例如E712s-与布尔值比较)。

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

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

pep8 --quiet --statistics .

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

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

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

  • 很多合并冲突
  • 不负责任
  • 使代码复查困难

作为另一种选择(多亏了@y-p for the idea),我编写了一个小包,它只自动部署自上次提交/分支以来您一直在处理的那些行:

基本上只剩下一点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

基本上^{}是对git/hg diff(来自the last shared commit)输出中的行应用autopep8。

这个脚本目前与git和hg一起工作,如果您使用了其他东西,并且希望它工作please post a comment/issue/PR

相关问题 更多 >

    热门问题