让代码变得更易维护的7个Python库


Posted in Python onOctober 09, 2018

随着软件项目进入“维护模式”,对可读性和编码标准的要求很容易落空(甚至从一开始就没有建立过那些标准)。然而,在代码库中保持一致的代码风格和测试标准能够显著减轻维护的压力,也能确保新的开发者能够快速了解项目的情况,同时能更好地全程保持应用程序的质量。

使用外部库来检查代码的质量不失为保护项目未来可维护性的一个好方法。以下会推荐一些我们最喜爱的 检查代码 (包括检查 PEP 8 和其它代码风格错误)的库,用它们来强制保持代码风格一致,并确保在项目成熟时有一个可接受的测试覆盖率。

检查你的代码风格

PEP 8 是 Python 代码风格规范,它规定了类似行长度、缩进、多行表达式、变量命名约定等内容。尽管你的团队自身可能也会有稍微不同于 PEP 8 的代码风格规范,但任何代码风格规范的目标都是在代码库中强制实施一致的标准,使代码的可读性更强、更易于维护。下面三个库就可以用来帮助你美化代码。

1、Pylint

Pylint 是一个检查违反 PEP 8 规范和常见错误的库。它在一些流行的 编辑器和 IDE 中都有集成,也可以单独从命令行运行。

执行 pip install pylint 安装 Pylint 。然后运行 pylint [options] path/to/dir 或者 pylint [options] path/to/module.py 就可以在命令行中使用 Pylint,它会向控制台输出代码中违反规范和出现错误的地方。

你还可以使用 pylintrc 配置文件 来自定义 Pylint 对哪些代码错误进行检查。

2、Flake8

Flake8 是“将 PEP 8、Pyflakes(类似 Pylint)、McCabe(代码复杂性检查器)和第三方插件整合到一起,以检查 Python 代码风格和质量的一个 Python 工具”。

执行 pip install flake8 安装 flake8 ,然后执行 flake8 [options] path/to/dir 或者 flake8 [options] path/to/module.py 可以查看报出的错误和警告。

和 Pylint 类似,Flake8 允许通过 配置文件 来自定义检查的内容。它有非常清晰的文档,包括一些有用的 提交钩子 ,可以将自动检查代码纳入到开发工作流程之中。

Flake8 也可以集成到一些流行的编辑器和 IDE 当中,但在文档中并没有详细说明。要将 Flake8 集成到喜欢的编辑器或 IDE 中,可以搜索插件(例如 Sublime Text 的 Flake8 插件 )。

3、Isort

Isort 这个库能将你在项目中导入的库按字母顺序排序,并将其 正确划分为不同部分 (例如标准库、第三方库、自建的库等)。这样提高了代码的可读性,并且可以在导入的库较多的时候轻松找到各个库。

执行 pip install isort 安装 isort,然后执行 isort path/to/module.py 就可以运行了。文档中还提供了更多的配置项,例如通过 配置 .isort.cfg 文件来决定 isort 如何处理一个库的多行导入。

和Flake8、Pylint 一样,isort 也提供了将其与流行的 编辑器和 IDE 集成的插件。

分享你的代码风格

每次文件发生变动之后都用命令行手动检查代码是一件痛苦的事,你可能也不太喜欢通过运行 IDE 中某个插件来实现这个功能。同样地,你的同事可能会用不同的代码检查方式,也许他们的编辑器中也没有那种插件,甚至你自己可能也不会严格检查代码和按照警告来更正代码。总之,你分享出来的代码库将会逐渐地变得混乱且难以阅读。

一个很好的解决方案是使用一个库,自动将代码按照 PEP 8 规范进行格式化。我们推荐的三个库都有不同的自定义级别来控制如何格式化代码。其中有一些设置较为特殊,例如 Pylint 和 Flake8 ,你需要先行测试,看看是否有你无法忍受但又不能修改的默认配置。

4、Autopep8

Autopep8 可以自动格式化指定的模块中的代码,包括重新缩进行、修复缩进、删除多余的空格,并重构常见的比较错误(例如布尔值和 None 值)。你可以查看文档中完整的 更正列表。

运行 pip install --upgrade autopep8 安装 Autopep8。然后执行 autopep8 --in-place --aggressive --aggressive <filename> 就可以重新格式化你的代码。aggressive 选项的数量表示 Auotopep8 在代码风格控制上有多少控制权。在这里可以详细了解 aggressive 选项。

5、Yapf

Yapf 是另一种有自己的 配置项 列表的重新格式化代码的工具。它与 Autopep8 的不同之处在于它不仅会指出代码中违反 PEP 8 规范的地方,还会对没有违反 PEP 8 但代码风格不一致的地方重新格式化,旨在令代码的可读性更强。

执行 pip install yapf 安装 Yapf,然后执行 yapf [options] path/to/dir yapf [options] path/to/module.py 可以对代码重新格式化。 定制选项 的完整列表在这里。

6、Black

Black 在代码检查工具当中算是比较新的一个。它与 Autopep8 和 Yapf 类似,但限制较多,没有太多的自定义选项。这样的好处是你不需要去决定使用怎么样的代码风格,让 Black 来给你做决定就好。你可以在这里查阅 Black 有限的自定义选项 以及 如何在配置文件中对其进行设置 。

Black 依赖于 Python 3.6+,但它可以格式化用 Python 2 编写的代码。

执行 pip install black 安装 Black,然后执行 black path/to/dirblack path/to/module.py 就可以使用 Black 优化你的代码。

检查你的测试覆盖率

如果你正在进行编写测试,你需要确保提交到代码库的新代码都已经测试通过,并且不会降低测试覆盖率。虽然测试覆盖率不是衡量测试有效性和充分性的唯一指标,但它是确保项目遵循基本测试标准的一种方法。对于计算测试覆盖率,我们推荐使用 Coverage 这个库。

7、Coverage

Coverage 有数种显示测试覆盖率的方式,包括将结果输出到控制台或 HTML 页面,并指出哪些具体哪些地方没有被覆盖到。你可以通过 配置文件 自定义Coverage 检查的内容,让你更方便使用。

执行 pip install coverage 安装 Converage 。然后执行 coverage [path/to/module.py] [args] 可以运行程序并查看输出结果。如果要查看哪些代码行没有被覆盖,执行 coverage report -m 即可。

持续集成工具

持续集成(Continuous integration)(CI)是在合并和部署代码之前自动检查代码风格错误和测试覆盖率最小值的过程。很多免费或付费的工具都可以用于执行这项工作,具体的过程不在本文中赘述,但 CI 过程是令代码更易读和更易维护的重要步骤,关于这一部分可以参考 Travis CI 和 Jenkins 。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Python 相关文章推荐
解决python写的windows服务不能启动的问题
Apr 15 Python
pymongo给mongodb创建索引的简单实现方法
May 06 Python
Python实现将数据库一键导出为Excel表格的实例
Dec 30 Python
Python使用QRCode模块生成二维码实例详解
Jun 14 Python
Python反射用法实例简析
Dec 22 Python
TensorFlow实现Batch Normalization
Mar 08 Python
Django开发中的日志输出的方法
Jul 02 Python
修改python plot折线图的坐标轴刻度方法
Dec 13 Python
python pytest进阶之conftest.py详解
Jun 27 Python
python实现大量图片重命名
Mar 23 Python
python plt.plot bar 如何设置绘图尺寸大小
Jun 01 Python
python单向链表实例详解
May 25 Python
windows下cx_Freeze生成Python可执行程序的详细步骤
Oct 09 #Python
Python打包方法Pyinstaller的使用
Oct 09 #Python
Python如何发布程序的详细教程
Oct 09 #Python
python如何发布自已pip项目的方法步骤
Oct 09 #Python
Django csrf 验证问题的实现
Oct 09 #Python
Python正则表达式指南 推荐
Oct 09 #Python
详解Django的CSRF认证实现
Oct 09 #Python
You might like
PHP+DBM的同学录程序(2)
2006/10/09 PHP
投票管理程序
2006/10/09 PHP
怎样在PHP中通过ADO调用Asscess数据库和COM程序
2006/10/09 PHP
php的一个登录的类 [推荐]
2007/03/16 PHP
PHP中__get()和__set()的用法实例详解
2013/06/04 PHP
ueditor 1.2.6 使用方法说明
2013/07/24 PHP
stripos函数知识点实例分享
2019/02/11 PHP
javascript中的继承实例代码
2011/04/27 Javascript
js转义字符介绍
2013/11/05 Javascript
javascript Array 数组常用方法
2015/04/05 Javascript
jQuery编程中的一些核心方法简介
2015/08/14 Javascript
浅谈React 属性和状态的一些总结
2016/11/21 Javascript
nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
2016/12/30 NodeJs
JavaScript使用readAsDataURL读取图像文件
2017/05/10 Javascript
ajax+node+request爬取网络图片的实例(宅男福利)
2017/08/28 Javascript
webpack 4.0.0-beta.0版本新特性介绍
2018/02/10 Javascript
jQuery实现为table表格动态添加或删除tr功能示例
2019/02/19 jQuery
angularjs自定义过滤器demo示例
2019/08/24 Javascript
基于JavaScript实现留言板功能
2020/03/16 Javascript
详谈Vue.js框架下main.js,App.vue,page/index.vue之间的区别
2020/08/12 Javascript
[03:19]2016国际邀请赛中国区预选赛第四日TOP10镜头集锦
2016/07/01 DOTA
[45:10]NB vs Liquid Supermajor小组赛 A组胜者组决赛 BO3 第二场 6.2
2018/06/04 DOTA
Python利用ansible分发处理任务
2015/08/04 Python
Python3控制路由器——使用requests重启极路由.py
2016/05/11 Python
简单实现python画圆功能
2018/01/25 Python
对python numpy数组中冒号的使用方法详解
2018/04/17 Python
解决pycharm上的jupyter notebook端口被占用问题
2019/12/17 Python
python 实现保存最新的三份文件,其余的都删掉
2019/12/22 Python
python 数据库查询返回list或tuple实例
2020/05/15 Python
社区党务公开实施方案
2014/03/18 职场文书
2014年纠风工作总结
2014/12/08 职场文书
2015年员工试用期工作总结
2014/12/12 职场文书
学校推普周活动总结
2015/05/07 职场文书
《伯牙绝弦》教学反思
2016/02/16 职场文书
新手入门Mysql--sql执行过程
2021/06/20 MySQL
redis复制有可能碰到的问题汇总
2022/04/03 Redis