从以前一个不会敲 Python 代码的小白,到现在敲 Python 代码贼溜的老鸟的过程中,除了通过大量的学习、实践让自己现在更容易写出 Pythonic 的代码外,大部分时间里还是多亏着有着许多好用的工具辅助我,去检查我代码中的问题,帮助我写出更规范的代码。

学习和实践新知识可能对于大多数人来说都没有统一的定式,但使用工具至少可以让我们大家风格统一也更容易和他人协作共事。因此无论对于刚入门的小白还是正在成长的新人来说,会使用能辅助你写出更规范的代码的工具也是十分有必要的。

black

随着 PEP8 规范的提出,Python 社区也有了自己的一套关于 Python 代码的规范指导。但我相信,大多数人其实并不会条分缕析地去浏览或记下规范里的大多数内容,因为这些内容往往都过于琐碎,以至于在实际开发中我们很难做到去一边写代码一边去检查我们是否合乎 PEP8 规范。所以最好的方法就是借助格式化工具帮我们完成这一机械的操作。

早期 Python 著名的格式化工具的有 autopep8 和 Google 的yapf,但在实际过程中或多或少需要一些配置。

如果你使用过 Go 语言,那可能会对 Go 自带的 gofmt 赞叹不已。因为它既不会要求你进行多余的配置,还能在每次保存代码时强制帮你进行格式化,所以无论和你协作的同事们代码风格和个人习惯如何,它都能将其转换成符合工程的、规范的样式。

而 black 就是类似于 gofmt 这样号称 「不妥协」(uncompromising)的 Python 格式化工具,它让我们将更多的时间和精力放在编写代码上,而无需过度关注于格式化的配置细节。因此当我们在团队协作中只要是使用了 black 工具之后,大部分情况下代码看起来都是十分统一的。

比如说下面这一段代码(来源于官方示例):

def very_important_function(template: str, *variables, file: os.PathLike, engine: str, header: bool = True, debug: bool = False):"""Applies `variables` to the `template` and writes to `file`."""with open(file, 'w') as f:...

由于 very_important_function 已经加上了类型注解,因此在现有的部分参数所占宽度的基础上又扩展了一些,所以如果我们显示器的宽度不够时,就需要横向拖动才能查看参数信息;而最好的办法就是采取竖向的方式进行排列,便于我们能自上而下的一览无遗。所以使用 black 之后上述代码将会是这样:

def very_important_function(template: str,*variables,file: os.PathLike,engine: str,header: bool = True,debug: bool = False,
):"""Applies `variables` to the `template` and writes to `file`."""with open(file, "w") as f:...

可以看出,经过格式化后的函数其参数层次分明地对齐,可读性大大的增强了;并且如果需要对函数中的参数进行注释或增加,直接新增或减少一行即可,丝毫不会额外调整其他参数的位置。

尽管说 black 还是一个实验项目,但它早已频繁被使用在一些主流的 Python 开源项目中,比如 Pandas、SQLAlchemy、Pytest 等,所以就算在实际开发中我们一样可以没有顾虑地使用它。

使用 black 的方式很简单,通过 pip install black 安装到你的 Python 环境中,然后在代码中运行:

black <项目文件夹 / 源码文件夹 / .py 文件等>

black 命令行也提供了一些参数项(但不会太多),我们大部分时候即使我们使用默认的也是足够了的,具体我们可以参考 black 的官方文档。

isort

isort 是一个名为 PyCQA(Python Code Quality Authority)组织所维护的代码质量工具中的其中一个开源项目,它同样是用来对代码进行格式化。但不同于 black 的是,它主要用来格式化我们 import 的库或模块。

Python 社区的生态一直都是十分丰富,所以在开发项目的过程中我们往往会使用到多个库或同一个库中的多个模块,但在缺乏规范的情况下,被导入的部分可能会凌乱、无组织地分散在我们的代码中,所以当我们复现代码时很可能就会因为忘记导入某些模块而报错。

就像官方给出的示例代码一样:

from my_lib import Object
import os
from my_lib import Object3
from my_lib import Object2
import sys
from third_party import lib15, lib1, lib2, lib3, lib4, lib5, lib6, lib7, lib8, lib9, lib10, lib11, lib12, lib13, lib14
import sys
from __future__ import absolute_import
from third_party import lib3print("Hey")
print("yo")

上述的代码存在了多种 import 风格,比如同一模块下分别导入的部分各占一行、同一模块下导入的部分只站一行等;并且还存在重复导入的情况。因此要么我们就干脆每个导入的部分只占一行,要么就是来自同一模块下的导入部分都连接在一起。默认情况下 isort 会是后者:

from __future__ import absolute_importimport os
import sysfrom third_party import (lib1, lib2, lib3, lib4, lib5, lib6, lib7, lib8,lib9, lib10, lib11, lib12, lib13, lib14, lib15)from my_lib import Object, Object2, Object3print("Hey")
print("yo")

使用了 isort 之后它会将我们每个 .py 文件下中 import部分的代码进行规整,同时它会按照内置库(及字母顺序)、第三方库以及本地自有模块的次序对我们所导入的部分进行排列。这样我们的代码不仅看起来清爽了许多,同时也能准确定位到我们已经导入的部分有哪些。

isort 不会像 black 那样「执拗」,而是也给你尽可能地预留了一些可供自定义的配置项,以便能满足不同风格或团队规范的需要。但对它的使用和 black 一样简单,只需要将其安装到我们的环境中后,直接调用即可:

isort <项目文件夹 / 源码文件夹 / .py 文件等>

静态检查工具

由于像 Python、JavaScript 这些动态类型的解释型语言,不具备 Java、Go 这样静态类型的编译型语言在编译期时的检查机制,因此当一个项目中的代码量过多时,就会造成「动态一时爽,重构火葬场」的局面。

尽管 Python 社区推行了 PEP484 提案并让 Python 拥有了类型注解的能力,但不正确的使用依旧是很难达到静态语言编译检查的那种效果。所以,一些静态类型检查工具也就应运而生,以便能及时发现我们代码中的问题

目前关于 Python 的静态检查工具有许多,知名的有那么几个:

  • pylint:PyQCA 团队维护,提供了高度的可配置项(这当然也是缺点),如果你有在 VS Code 编写过 Python 代码,那么有可能就会碰到让你安装 pylint 的情况;

  • flake8:仍是由 PyQCA 团队维护,它在功能上和 pylint 存在重叠的地方,但它也集成了 PEP8、McCabe 以及第三方插件等多个部分,功能上比 pylint 相对丰富一些;

  • mypy:由 Python 的缔造者 Guido van Rossum(Python 使用者们亲切将其称为龟叔)在 Dropbox 工作时所创建,可以说没有人比他更了解 Python 了,也可以算作是相对权威静态检查工具了;

  • pyright 由微软开源的、基于 TypeScript 和 JavaScript 编写,高度集成于 VS Code,对于经常使用 VS Code 来写代码的人来说或许是个比较好的选择;

  • pytype 由谷歌开源并维护,但相对于其他工具来说检查会较为宽松一些。

以上都是使用人数多的、并且质量都较为上乘静态检查工具,可以根据自己或团队的实际需要来选择;不过 flake8 和 mypy 通常都算是一个正规项目中的标配了,这里我就只以 flake8 为例。

和前面两个的工具一样,先通过 pip install flake8 命令安装之后再使用:

flake8 <项目文件夹 / 源码文件夹 / .py 文件等>

大部分情况下,flake8 会根据默认的一些规范对代码进行检查,默认是依照 pyflake 的错误(或违规)码表来进行检查,你可以在 flake8 官方 《Error/Violation Codes》 一章中浏览到完整的码表;当然我们也可以通过特定的命令行参数来指定检查的事项或忽略掉的事项:

flake8 --select E121 example.py

这里就只会选择检查 E121 这项来自于 pycodestyle 码表中的一项,如果代码导入的模块或包没有缩进或悬挂,那 flake8 就会在检查代码之后抛出信息:

example.py:5:9: E121 continuation line under-indented for hanging indent

这里就对应着 example.py 文件里的第 5 行到第 9 行代码,我们直接就可以根据 flake8 的结果精准修改检验不通过的部分即可。

工具链整合

上述说的几个工具,大部分情况都能通过 IDE、脚本、Git Hook 等途径得到有效整合。通常情况下我都会在每次提交代码到仓库前预先分别使用 isort、black 以及静态检查的 flake8。

由于 black 的情况会比较特殊,像 isort 这样的格式化工具处理过后的代码都会 black 再次格式化,因此 black 也给出了兼容其他工具的配置项共同选项,尽最大程度的和其他工具共存。根据 black 官方的建议,通常我们可以放在某些配置文件中,比如 pyproject.tomlsetup.cfg 等,内容如下:

multi_line_output = 3
include_trailing_comma = True
force_grid_wrap = 0
use_parentheses = True
ensure_newline_before_comments = True
line_length = 88

同理,flake8 也是如此:

max-line-length = 88
extend-ignore = E203, W503

因此我们可以将以上内容都写在一个配置文件中,这里我选的是 setup.cfg 文件中:

[isort]
multi_line_output = 3
include_trailing_comma = True
force_grid_wrap = 0
use_parentheses = True
ensure_newline_before_comments = True
line_length = 88[flake8]
max-line-length = 88
extend-ignore = E203, W503

这样就能使得 black、isort 和 flake8 能够更好地协同工作;同时我们可以将其放在一个脚本文件中,方便每次运行调用,大致类似于:

# code_fmt.shWORKDIR=$PWD
isort $WORKDIR \&& black $WORKDIR --skip-string-normalization \&& flake8 $WORKDIR

当然我们也可以将其集成在我们的 IDE 中,比如在 VS Code 中,当我们安装好上述工具后,可以在设置项中关于 Python 的配置项里找到关于上述工具的配置栏目。

Python 工具链让你写的代码更规范相关推荐

  1. php 兼容火狐,PHP_CSS兼容IE与火狐浏览器超强兼容代码,如何让你写的代码更兼容火狐 - phpStudy...

    CSS兼容IE与火狐浏览器超强兼容代码 如何让你写的代码更兼容火狐和IE两大主流浏览器?本文将总结总结CSS中火狐浏览器与IE浏览器的兼容代码,兼容你兼容主要是语法规范问题,你写CSS写规范了,就都兼 ...

  2. php 兼容火狐,HTML_总结CSS中火狐浏览器与IE浏览器的兼容代码,如何让你写的代码更兼容火狐 - phpStudy...

    总结CSS中火狐浏览器与IE浏览器的兼容代码 如何让你写的代码更兼容火狐和IE两大主流浏览器?本文将总结总结CSS中火狐浏览器与IE浏览器的兼容代码,兼容你兼容主要是语法规范问题,你写CSS写规范了, ...

  3. 【效率】微软开源最强Python自动化神器!不用写一行代码!

    相信玩过爬虫的朋友都知道selenium,一个自动化测试的神器工具.写个Python自动化脚本解放双手基本上是常规的操作了,爬虫爬不了的,就用自动化测试凑一凑. 虽然selenium有完备的文档,但也 ...

  4. python简单代码编写-新手写Python,8招让你的代码更简洁更Pythonic!

    Python是一门非常灵活的语言,很多语法是其他语言不具备的,特别是对于从C.Java等语言转向Python的人来说,很容易按照C.Java等语言的写法来写Python,对于初学者来说,如果对Pyth ...

  5. postgresql python连接不用把密码写在代码里[.pgpass]

    在家目录下创建一个.pgpass文件,并在里面写入你的数据库登录信息,格式如下: host:port:db_name:user_name:password sudo chmod 600 .pgpass ...

  6. 最黑链的如何写隐藏代码

    最近看很多站长都在讨论黑链,挂黑链,买黑链以及买软件等话题,黑链这东西要就不用,用来后你就会离不开它,说他有坏处但是用的人有很多,真正说不好的都是弄不到黑链的人,其实黑链有没有好处,自己用了就知道,因 ...

  7. python 爬虫 链家网二手房信息采集代码

    直接上代码吧,应该很好理解 import requests import lxml.html import time from fake_useragent import UserAgent impo ...

  8. Python笔记 - 电话号码题自己写的代码

    这道题是夜曲变成百题斩的第99题,自己一点点查资料摸索出来的代码,有点小骄傲,所以分享在这里(这只是一个参考.应该有大佬有更简洁的写法) import randomdef phoneNo(operat ...

  9. python等号语法错误_Python干货:代码编写规范

    本章节我们来讲述一下Python的编码规范,通过详细对代码编写规则以及命名规范等进行介绍. 1.编写规则 Python采用PEP 8 的编码规范,接下来会讲解一些我们在学习Python过程应该严格遵守 ...

最新文章

  1. PHP函数--var_dump
  2. (转)如何在一台电脑上开启多个tomcat 和配置让系统识别哪个具体的tomcat
  3. linux vim python配置文件,Linux VIM8 Python 编辑器配置文件
  4. 在Linux中如何查看文件的修改日期
  5. 如何学STM32 —— 十年经验教你如何学习嵌入式系统
  6. 计算机组成说明,计算机组成与系统结构考试说明.ppt
  7. 腾讯电脑管家离线安装包_这个良心小工具,让你电脑流畅1倍,干掉流氓软件...
  8. Android的EditText文字动态监听
  9. MySQL之存储过程和函数
  10. 【皇甫】☀PPT里的小玩意
  11. Tomcat内存设置方法(转载并实践)
  12. 热门软件看点:哇嘎和它的对手们
  13. Rhino(犀牛)室内模型导入Unity3d快速烘焙光影【2020】
  14. python微信抢票脚本_春节到了 教你使用python来抢票回家
  15. 纯js实现俄罗斯方块详解与源码
  16. Python与Matlab算法学习一文通(快速排序算法)(更新中)
  17. 微信小程序token过期后重新执行失效的请求封装(用户无感刷新token)
  18. 电脑连打印机不打印,是怎么回事?
  19. Review of 2012 Goal for 2013
  20. lua对接bmob数据库

热门文章

  1. windows系统下的python环境的搭建
  2. Powershell交互式
  3. 黑马程序员pink老师前端入门教程,零基础必看的h5(html5)+css3+移动端前端视频教程(CSS3)
  4. 运城学院数学与计算机系,运城学院数学与信息技术学院.doc
  5. CentOS7下Hadoop集群搭建
  6. JVM 垃圾回收机制和常见算法
  7. centos7 VNC-Server-6.7.2
  8. 关于Qstring.replace传参Qstring.length为0引起程序退出的记录
  9. 关于拦截hao123页面广告的自定义规则
  10. 2019考研调剂信息 计算机专业,2019考研分数线还未公布,已公布的调剂信息是真的吗?...