问题:将Python代码转换为符合PEP8的工具
我知道有一些工具可以验证您的Python代码是否符合PEP8,例如,既有在线服务又有python模块。
但是,我找不到可以将我的Python文件转换为自包含的PEP8有效Python文件的服务或模块。有人知道是否有吗?
我认为这是可行的,因为PEP8完全是关于代码的外观,对吧?
回答 0
不幸的是,“ 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!
回答 1
您可以使用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无法纠正这些代码。
回答 2
@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代码!
回答 3
如果您使用的是eclipse + PyDev,则只需从PyDev的设置中激活autopep8:Windows-> Preferences->在搜索过滤器中键入’autopep8’。
选中“使用autopep8.py进行代码格式化?” ->好
现在,eclipse的CTRL-SHIFT-F代码格式应该使用autopep8来格式化代码:)
回答 4
我对python和代码风格的不同工具进行了广泛的研究。有两种类型的工具:linters-分析您的代码并给出有关错误使用的代码样式的警告并显示有关如何修复它的建议,以及code formatter-在保存文件时,它将使用PEP样式重新设置文档格式。
因为重新格式化必须更加准确-如果重新格式化您不希望的内容变得无用-它们覆盖的PEP所占比例较小,因此棉绒显示的更多。
它们都具有不同的配置权限-例如,在所有规则中都可以配置pylinter(您可以打开/关闭每种类型的警告),根本无法配置黑色。
以下是一些有用的链接和教程:
说明文件:
- PEP-257 Docstring约定: https
- PEP-484类型提示: https //www.python.org/dev/peps/pep-0484
- 铬风格指南 https://chromium.googlesource.com/chromiumos/docs/+/master/styleguide/python.md
- 自动测试的代码样式 https://chromium.googlesource.com/chromiumos/third_party/autotest/+/master/docs/coding-style.md
- 可汗学院编码样式指南 https://github.com/Khan/style-guides/blob/master/style/python.md
- 搭便车的Python指南 https://docs.python-guide.org/
- EdX Python样式指南 https://edx.readthedocs.io/projects/edx-developer-guide/zh/latest/style_guides/python-guidelines.html
- RealPython上的代码样式文章https://realpython.com/python-pep8/
短绒(按受欢迎程度排序):
- mypy https://github.com/python/mypy linter 用于类型检查(PEP-484)
- pycodestyle https://github.com/PyCQA/pycodestyle-使用PEP-8的好人,非常受欢迎。通常与pylint和flake8同时使用(同时)
- pylint https://github.com/PyCQA/pylint配置,积极支持
- 强盗https://github.com/PyCQA/bandit линтер俄语Побезопасности
- 探矿者https://github.com/PyCQA/prospector pylint +代码难度检查
- flake8 https://github.com/PyCQA/flake8 pycodestyle包装器,具有打开插件的功能。不同的可配置插件的非常大的列表。这是很棒的flake8存储库:https : //github.com/DmytroLitvinov/awesome-flake8-extensions
- wemake https://github.com/wemake-services/wemake-python-styleguide-尝试在一个项目中组合很多不同的linters(实际上是一个flake8插件,结合了其他几个linters的样式)
- pylama https://github.com/klen/pylama尝试将10个其他linters合并为一个(mypy,pylint,pycodeestyle,pydocstyleидр。)。我可以在这里看到唯一的问题-旧版本(github仓库中约10个月没有更新。)
- pydocstyle https://github.com/PyCQA/pydocstyle docstrings 短绒(PEP-257)
代码格式化程序(按流行程度排序):
- 黑色 https://github.com/psf/black最流行的格式化程序,在多家大公司中使用。创建时间比yapf晚,但在GitHub上已有更多开始
- yapf https://github.com/google/yapf Google代码格式化程序
- autopep8 https://github.com/hhatto/autopep8建立在pycodestyle之上
回答 5
有许多。
IDE通常具有一些内置的格式化功能。IntelliJ Idea / PyCharm确实具有这种功能,Eclipse的Python插件也是如此,依此类推。
有些格式化程序/分类符可以针对多种语言。https://coala.io是一个很好的例子。
然后是单目的工具,其他答案中提到了许多工具。
自动重新格式化的一种特定方法是将文件解析为AST树(不删除注释),然后将其转储回文本(意味着不保留任何原始格式)。例如:https://github.com/python/black。