简介
Python 项目本地开发指南。
面向对象:python初、中级、有一定其他语言基础准备转python的人员。
本文目标:了解如何标准化、规范化开始一个python项目。
Python版本管理
几乎在所有的 python 新手教程中,第一步都是到 python.org (python 官网)下载适合您平台版本的python安装包。这对于python 萌新来说应该是最快速、简单的开始学习python语法的方式,但是在标准、规范的实际项目开发过程中,此种方式往往对项目开发有带来限制和一些不必要的麻烦。例如:
你刚刚进入一个新公司接手了一个python项目A,该项目使用的 python3.6.5,你刚拿到项目代码后就开始马不停蹄的搭建项目环境,你首先看下项目开发平台,发现该项目可以在windows、类unix平台下开发,你挑选了自己最熟悉的win平台后,到python官网下载了对应版本的 python安装包,经过一顿梭哈后,你成功在自己的windows电脑上安装了python3.6.5, 并使用pip工具成功安装了该项目的所有依赖包,你此时内心狂喜,因为马上你就可以施展自己最得意的cv大法了。
就这样用cv大法开发了一个月后,你的能力得到上级领导的认可,于是你很快参与了另一个项目B,你此时内心非常淡定,心想:这还不是小菜一碟,可是当你刚打开项目准备安装依赖时,发现该项目比较老旧,使用的python版本居然是python2.7.9,你瞬间有种想骂人的冲动,可任务已经接了,作为中国人还是要有迎难而上的精神(主要是你nb已经吹出去了/(ㄒoㄒ)/~~)。
然后你就开始面向百度编程了,经过搜索你成功的找到了一篇教程,你满心欢心按照教程cv大法一把梭,成功安装了python2.7.9,你以为事情就这样解决了,可以有天测试人员通知你 A项目出现了个bug,你马上去启动A项目本地环境去复现bug,可是当你准备启动项目时,发现项目一直启动失败,经过排查,你发现当你在命令行中输入 python时,启动的始终是python2.7.9的环境,于是你又打开百度,最终发现是在安装python2时覆盖了python3的环境变量,于是你安装教程更改了环境变量后解决了该问题,并修复了A项目的bug。
可是好景不长,由于你能力突出(C,该项目要求强制使用python3.6.12,于是你有开始安装python3.6.12,安装完后你很自然的想到当初安装python2时环境变量导致的问题,你又安装之前方法更改环境变量,但是此时你发现:对于python3.6.9和python3.6.12不是很好通过环境变量区分启动。然后你又开始了百度之旅......
好了,故事就不讲了,因为接下来还有可能有 py3.7、pypy3.8......
好了废话少说,上主角:pyenv ,该工具可以解放你的双手,让你优雅的管理python。
安装 pyenv or pyenv-win
如何使用pyenv
查看可安装python版本
安装指定python3.9.6版本
查看已安装所有版本
激活指定python版本
激活python的方式有三种
Python项目依赖管理
相信每个刚学python的程序员接触python项目依赖管理相关知识时,第一印象都会想到用 requirements.txt 记录项目的依赖包,在安装时使用 pip install -r ... 即可全局安装指定文件中所记录的依赖,这种方式对于小项目来说应该是最快速的管理依赖的方法,然而,在实际的团队多人大项目开发和部署时,该方案对于依赖的管理会显得稍有不足。
举个栗子, 在新项目中你使用了requirements.txt管理依赖,你在开发过程用没有任何问题,但是当你开发项目准备部署时,你忘记了在requirements.txt文件中记录你的项目依赖了哪些包,以及依赖的版本号,于是想想到了 pip freeze 命令,将本地的全局环境中的所有安装包都导出到requirements.txt文件中,可是你发现该方法导出的依赖包含了全局环境中的所有依赖项,甚至包含了其他项目的依赖,以及开发插件工具等各种第三方包。
于是,你又在requirements.txt 文件中一条一条的比对,删除不需要的依赖,对于较少的依赖你还可以很快的理清,但是在随着开发推进,你发现你全局依赖包安装的太多,甚至同一个包需要不同的版本依赖,这时你会发现好多时间浪费在了依赖管理上...
duang,【Poetry】带着需求出现了...
使用 Poetry 你可以管理 python虚拟环境(如果不知道什么虚拟环境请百度),每个项目的环境依赖,并且每个项目之间都是独立且互不影响。其实在 Poetry 出现之前,python社区也有个pipenv的工具包,该工具包也是用于管理python项目依赖的,但是最近pipenv跟新似乎不太活跃,github上有很多bug为解决,而Poetry在性能、功能、更新呢频率上,从目前来看都要好于pipenv,所以本文直接推荐了Poetry,来用于python项目的依赖管理。
如何安装Poetry
![](https://i-blog.csdnimg.cn/blog_migrate/fce205a33bb64fb27acc94cf89e886ed.png)
使用pyenv 激活指定版本的python环境
使用Poetry创建新项目
使用Poetry给上述新建项目创建独立的虚拟环境
激活虚拟环境
使用Poetry安装项目依赖
查看Poetry配置信息
更改国内源存储库
依赖文件规范
![](https://i-blog.csdnimg.cn/blog_migrate/d0398e20e5d26948cce91cfa5a16532c.png)
依赖文件示例
##### 版本号描述 请参考文末链接【语义化版本】
##### toml 文件语法描述参考文末链接【Toml语言】
TOML 旨在成为一个语义明显且易于阅读的最小化配置文件格式。被设计成可以无歧义地映射为哈希表。应该能很容易地被解析成各种语言中的数据结构。
lTOML 目前已得到python官方认可。
如何进行单元测试
什么是单元测试
如果你听说过“测试驱动开发”(TDD:Test-Driven Development),单元测试就不陌生。
软件测试按开发阶段划分:单元测试,集成测试,系统测试,验收测试,用户测试等。这里说的单元测试,就是第一阶段,一般都是开发去做,在国内绝大部分公司都是开发去做单元测试。单元测试就是测试的对象是程序中的最小单元。程序的最小单元可以是一个函数,一个类,也可以是函数的组合,类的组合。单元测试通过后有什么意义呢?如果我们对abs()函数代码做了修改,只需要再跑一遍单元测试,如果通过,说明我们的修改不会对abs()函数原有的行为造成影响,如果测试不通过,说明我们的修改与原有行为不一致,要么修改代码,要么修改测试。这种以测试为驱动的开发模式最大的好处就是确保一个程序模块的行为符合我们设计的测试用例。在将来修改的时候,可以极大程度地保证该模块行为仍然是正确的。
python单元测试框架
pytest、unittest、PyUnit、nose,本文以pytest为例。
pytest是一个流行的框架,得到了广泛的采用。它非常受欢迎,作为Poetry的默认测试框架。因此,如果我们在pyproject.toml中打开[tool.poetry.dev-dependencies]部分,我们可以看到pytest已经被列为开发依赖项。
测试覆盖率
哪里有测试,哪里就有测试覆盖率,测试覆盖率通常被用来衡量测试的充分性和完整性,从广义的角度来讲,测试覆盖率主要分为两大类,一类是面向项目的需求覆盖率,另一类是更偏向技术的代码覆盖率。
首先安装 pytest-cov,主要是因为上文使用的测试框架是 pytest.
高的代码覆盖率不一定能保证软件的质量,但是低的代码覆盖率一定不能能保证软件的质量!!!
ok,本章先讲到这里,后面文章将讲解如何开启版本控制、以及python编码规范方面的知识。
[参考链接]