python 开发工具_「干货」推荐一整套 Python 开发工具
文 | Brendan Maginnis 译 | EarlGrey
在开始一个新的Python项目时,很容易不做规划直接进入编码环节。花费少量时间,用最好的工具设置项目,将节省大量时间并带来更快乐的编码体验。
在理想的世界中,所有开发人员使用的依赖库都是相同的,代码将被完美地格式化,禁止常见错误,并且测试将涵盖所有内容。此外,每次提交代码时都会确保符合这些要求。
在本文中,我将介绍如何设置一个这样的理想项目。你可以跟随我的步骤操作,也可以直接开始安装pipx和pipenv,然后生成新项目。
让我们创建一个新的项目目录:
mkdir best_practicescd best_practices
Python命令行工具与pipx
Pipx是一个方便的实用程序,允许快速安装python命令行工具。我们将用它来安装 pipenv 和 cookiecutter 。
python3 -m pip install --user pipxpython3 -m pipx ensurepath
使用 pipenv 进行依赖管理
Pipenv自动为您的项目创建和管理virtualenv,以及在安装/卸载软件包时从Pipfile添加/删除软件包。它还生成了非常重要的Pipfile.lock文件,用于生成确定性构建。
知道你和你的同事正在使用相同的库版本,可以极大提升信心。Pipenv 可以实现这个点,因此在过去一年多里得到了大量开发者的青睐
pipx install pipenv
使用 black 和 isort 进行代码格式化
Black是代码格式化工具:
Black是不妥协的Python代码格式化程序。通过使用它,意味着您同意放弃对手动格式化细节的控制。作为回报,Black 为你提供速度和确定性,并且无需处理 pycodestyle 的繁琐提示。你将有更多的时间,来处理更重要的事情。
无论是什么项目,Black 格式化后的代码看起来都是一样的。习惯之后,你不会再注意到格式的问题,可以专注于内容。
Black产生的代码差异最小,可以加速代码审查。
isort则用来处理 import 的排序:
isort是可以按字母顺序对 import 进行排序,并自动分成多个部分。
让我们使用pipenv安装它们为开发依赖库,这样就不会让部署版本变得更复杂:
pipenv install black isort --dev
Black 和 isort 的默认选项之间有冲突,因此我们将覆盖 isort 的选项配置,使用 Black 的配置。创建一个 setup.cfg文件并添加此配置:
[isort]multi_line_output=3include_trailing_comma=Trueforce_grid_wrap=0use_parentheses=Trueline_length=88
我们可以这样运行这些工具:
pipenv run blackpipenv run isort
用flake8强化风格
Flake8确保我们的代码遵循PEP8的约定。使用pipenv安装:
pipenv install flake8 --dev
就像isort一样,它需要一些配置才能与 Black 配合使用。将此配置添加到 setup.cfg:
[flake8]ignore = E203,E266,E501,W503max-line-length = 88max-complexity = 18select = B,C,E,F,W,T4
现在我们可以使用 pipenv run flake8运行flake8。
使用 mypy 检查静态类型
Mypy是Python的一个可选静态类型检查器,旨在结合动态(或“鸭子”)类型和静态类型的好处。Mypy将Python的表现力和便利性与强大的类型系统和编译时类型检查相结合。Mypy对标准Python程序进行类型检查,使用 Python VM 运行 mypy 基本没有运行时的开销。
在Python中使用类型需要慢慢习惯,但好处是巨大的。mypy 官网这样写道:
- 静态类型可以使程序更容易理解和维护
- 静态类型可以帮助您更早地发现错误,并减少测试和调试
- 静态类型可以帮助您在代码投入生产之前找到难以发现的错误
pipenv install mypy --dev
默认情况下,Mypy将递归检查所有类型注释的导入,这会导致库不包含这些注释时出错。我们需要将mypy配置为仅在我们的代码上运行,并忽略没有类型注释的导入的任何错误。我们假设代码存在于以下配置的 best_practices包中。将如下配置添加到 setup.cfg:
[mypy]files=best_practices,testignore_missing_imports=true
现在我们可以运行mypy:
pipenv run mypy
mypy 的速查表:https://mypy.readthedocs.io/en/latest/cheatsheetpy3.html
使用pytest和pytest-cov进行测试
使用pytest编写测试非常容易,并且消除编写测试的阻力,意味着我们会编写更多的测试!
pipenv install pytest pytest-cov --dev
以下是pytest网站的一个简单示例:
# content of test_sample.pydef inc(x): return x + 1def test_answer(): assert inc(3) == 5
执行示例:
$ pipenv run pytest=========================== test session starts ============================platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.ycachedir: $PYTHON_PREFIX/.pytest_cacherootdir: $REGENDOC_TMPDIRcollected 1 itemtest_sample.py F [100%]================================= FAILURES =================================_______________________________ test_answer ________________________________ def test_answer():> assert inc(3) == 5E assert 4 == 5E + where 4 = inc(3)test_sample.py:6: AssertionError========================= 1 failed in 0.12 seconds =========================
所有的测试都应该放在 test目录中,所以将这个配置添加到 setup.cfg:
[tool:pytest]testpaths=test
我们还想检查测试覆盖了多少代码。创建一个新文件 .coveragerc,用来返回应用程序代码的覆盖率统计信息,我们再次假设代码位于 best_practices模块中:
[run]source = best_practices[report]exclude_lines = # Have to re-enable the standard pragma pragma: no cover # Don't complain about missing debug-only code: def __repr__ if self.debug # Don't complain if tests don't hit defensive assertion code: raise AssertionError raise NotImplementedError # Don't complain if non-runnable code isn't run: if 0: if __name__ == .__main__.:
我们现在可以运行测试并报告覆盖率
pipenv run pytest --cov --cov-fail-under=100
如果对应用程序代码的测试覆盖率低于100%,则会失败。
pre-commit 的 Git 钩子
Git钩子允许您在任何时候提交或推送时运行脚本。这就可以支持我们在每次提交/推送时,自动运行所有的格式化和测试。pre-commit可以帮助我们轻松配置这些钩子:
在提交代码审查之前,Git钩子脚本可以帮助识别简单问题。每次提交时运行钩子,自动指出代码中的问题,例如缺少分号,尾随空格和调试语句。在代码审查之前指出这些问题,可以让代码审查者专注于代码架构的变化,而不是浪费时间检查格式问题。
在这里,我们配置在提交Python 文件修改时,执行上述所有检查,并且仅在推送时运行pytest覆盖率测试,因为耗时可能较长。创建一个新文件 .pre-commit-config.yaml:
repos:- repo: local hooks: - id: isort name: isort stages: [commit] language: system entry: pipenv run isort types: [python] - id: black name: black stages: [commit] language: system entry: pipenv run black types: [python] - id: flake8 name: flake8 stages: [commit] language: system entry: pipenv run flake8 types: [python] exclude: setup.py - id: mypy name: mypy stages: [commit] language: system entry: pipenv run mypy types: [python] pass_filenames: false - id: pytest name: pytest stages: [commit] language: system entry: pipenv run pytest types: [python] - id: pytest-cov name: pytest stages: [push] language: system entry: pipenv run pytest --cov --cov-fail-under=100 types: [python] pass_filenames: false
如果你需要跳过这些钩子,你可以运行 git commit--no-verify或 git push--no-verify
使用cookiecutter生成项目
我们已经看到了理想项目都使用了哪些工具,可以将其固化为一个模板,只需要1个命令 即可生成新项目:
pipx run cookiecutter gh:sourceryai/python-best-practices-cookiecutter
填写项目名称和仓库名称,即可使用模板为你生成项目。
要完成设置,请按照下列步骤操作:
# Enter project directorycd # Initialise git repogit init# Install dependenciespipenv install --dev# Setup pre-commit and pre-push hookspipenv run pre-commit install -t pre-commitpipenv run pre-commit install -t pre-push
模板项目包含一个非常简单的Python文件和测试来试用这些工具。一旦你对代码感到满意,你就可以做第一个 git commit,这时所有的钩子都会运行。
最后,我自己是一名从事了多年开发的Python老程序员,辞职目前在做自己的Python私人定制课程,今年年初我花了一个月整理了一份最适合2019年学习的Python学习干货,可以送给每一位喜欢Python的小伙伴,想要获取的可以关注我的头条号并在后台私信我:01,即可免费获取。
python 开发工具_「干货」推荐一整套 Python 开发工具相关推荐
- ise仿真添加信号_「干货」推荐一款FPGA仿真调试鸟枪换炮的工具
俗话说,隔行如隔山.非微电子专业没有做过芯片的同学,是不知道这个世界上还有效率更高的用来对Verilog/VHDL代码进行仿真的工具的.具体来讲,对于做FPGA开发的同学而言,需要知道除了ModelS ...
- 用typescript完成倒计时_「干货」将数十万行CoffeeScript代码迁移到TypeScript
作者 | David Goldstein 译者 | 王强 策划 | 小智 转发链接:https://mp.weixin.qq.com/s/TK7kWXX4hR3e-jtpVMuBnw 序言 2017 ...
- 110配线架打法图解_「干货」图文并茂教会你110语音配线架线缆打法
原标题:「干货」图文并茂教会你110语音配线架线缆打法 110语音配线架是机房工程中常用的语音配线工具,下面我们就来看下110配线架是如何安装的,以安装25对大对数为例. 110语音配线架 (1)将配 ...
- python 中主线程结束 子线程还在运行么_「干货」python线程笔记
引言&动机 考虑一下这个场景,我们有10000条数据需要处理,处理每条数据需要花费1秒,但读取数据只需要0.1秒,每条数据互不干扰.该如何执行才能花费时间最短呢? 在多线程(MT)编程出现之前 ...
- python决策树可视化_「决策树」| Part3—Python实现之可视化
文章首发于微信公众号:AlgorithmDeveloper,专注机器学习与Python,编程与算法,还有生活. 1.前言 「决策树」| Part2-Python实现之构建决策树中我们已经可以基于给定数 ...
- python数学函数_「分享」关于Python整理的常用数学函数整理
原标题:「分享」关于Python整理的常用数学函数整理 1.函数说明 abs(number)返回数字的绝对值,如abs(-10)返回10 pow(x,y[,z]) 返回x的y次幂(所得结果对z取模), ...
- pep8 python 编码规范_「原创」「python自学笔记」python编码规范
编码规范是学习一个语言前必须要了解的. Python采用PEP8作为编码规范,PEP是Python Enhancement Proposal(Python 增强建议书)的缩写,8代表的是Python代 ...
- 请求失败或服务未及时响应 有关详细信息_「干货」从零开始的微服务搭建之路...
随着公司的业务发展,有幸经历了从单体应用迁移到分布式应用,又从分布式应用开始准备搭建微服务应用,以下是公司从零开始搭建微服务的过程,记录并分享出来,希望对大家有所帮助,我们先使用Spring Clou ...
- flutter git 拉不起来_「干货」Flutter开发环境配置备忘录
为什么要用Flutter? 嗯,本篇文章不会讲,因为我认为想看这篇文章的应该已经下定决心要学习Flutter. Flutter开发环境支持安装在Windows.Mac OS和Linux下,区别在于Wi ...
最新文章
- Word中项目符号和编号用法详解
- pythonexe32位-如何使用pyinstaller打包32位的exe程序
- 硬盘FAT32转NTFN格式的命令
- Vue文件的缩进改为4个空格
- 去掉a标签下划线_条码软件如何修改条码标签的字体格式
- scala学习手记5 - 元组与多重赋值
- MSCI发布最新ESG评级 三七互娱位居A股游戏行业最高
- 万字长文+思维导图帮你梳理 Java IO 流,还学不会你来打我(值得收藏)
- 南大通用极速内存数据库
- 蓝牙模块HC-06的基本设置和他的AT指令集
- DWG转PDF在线转换怎么转?这个方法线上线下都能用
- 头的各个部位示意图_人体头部结构图:人体图片头部组织图文解读
- 小米路由器r2d_小米路由器二代R2D怎样设置无线中继模式
- 程序员容易发福的原因及解决办法
- vue 中 数字0和空字符串,=== 和== 用法和区别
- 两级运算放大器设计与仿真
- 基于51单片机的自动红外感应洗手器proteus仿真程序设计
- 设备VMnet0上的网桥因桥接的以太网接口关闭而暂时停止运行(此虚拟机可能无法与主机或网络中的其他计算机通信)
- 【报告】德勤管理咨询2019年境内外TMT标杆企业高管薪酬与激励调研报告
- 电商价格数据监测接口/品牌商品控价接口/商品数据分析接口/比价搜索API接口,超详细的接口说明
热门文章
- Android学习笔记---27_网络通信之通过GET和POST方式提交参数给web应用,以及使用httpClient,来给web项目以post方式发送参数
- JPA学习笔记---JPA实体Bean的建立+配置文件+junit测试+自动生成(对应实体Bean的)数据库表+插入数据
- Java中的HashSet和TreeSet
- c++ fstream类详解
- java防御性编程_代码防御性编程的十条技巧
- 随想录(mmu的学习)
- 随想录(网站api的设计)
- 随想录(编译器是怎么工作的)
- 司机行为识别_台州交警上线“闯红灯抓拍神器”人脸识别+4米大屏,拍到违章直接曝光...
- 内外网切换软件_不需要软件,用命令简单实现内外网切换指定网段走哪条线路...