在程序開發(fā)時(shí)候一套好的開發(fā)環(huán)境和工具棧,可以幫我們極大的提高開發(fā)的效率,避免把大量時(shí)間浪費(fèi)在周邊瑣事上。
本文以Python的為例,教大家如何快速打造優(yōu)秀的Python的項(xiàng)目開發(fā)環(huán)境:內(nèi)容涵蓋了模塊依賴管理,代碼風(fēng)格管理,調(diào)試測(cè)試管理和Git版本管理,使用git hook做項(xiàng)目規(guī)范檢查等。
pipx
Pipx是一款跨平臺(tái)的Python環(huán)境隔離管理工具,可以在支持在Linux,Mac OS和Windows上運(yùn)行.Pipx默認(rèn)在是個(gè)人用戶下建立虛擬Python環(huán)境,并以此建立實(shí)現(xiàn)完全隔離的Python運(yùn)行環(huán)境。安裝pipx需要Pthon 3.6及以上版本:
python3 -m pip?
install
?
--user pipx?
python3 -m pipx ensurepath?
升級(jí)Pipx使用:
python3
?-m pip install -U pipx?
包依賴管理pipenv
Pipenv會(huì)自動(dòng)為你的項(xiàng)目創(chuàng)建和管理虛擬環(huán)境,以pipfile文件方式方式管理項(xiàng)目的依賴包,支持包的安裝和卸載。和requirements.txt不同,pipfile是TOML格式,支持開發(fā)環(huán)境與正式環(huán)境,還可以使用Pipfile.lock鎖定環(huán)境版本.pipxenv的安裝可以使用pipx:
pipx
?安裝pipenv?
有些發(fā)行版也是可以直接通過其包管理器安裝的:
比如MacOS的可以下可以使用:
brew
?安裝pipenv?
一個(gè)pipfile的示例如下:
Pipfile.lock的示例部分如下:
代碼風(fēng)格
代碼格式化黑色
代碼格式的統(tǒng)一不光可以給我們一個(gè)愜意的代碼格式,而且可以避免由于開發(fā)人員之間的代碼風(fēng)格差異導(dǎo)致的溝通和協(xié)作問題。
黑就是用來格式化的Python代碼的程序。它可以自動(dòng)幫我們對(duì)代碼格式進(jìn)行調(diào)整和統(tǒng)一,提高代碼效率和可讀性。而且通過黑色減小代碼風(fēng)格的差異,可以極大提高團(tuán)隊(duì)進(jìn)行代碼審查的效率。
一個(gè)黑色格式化示例如下:
原始代碼:
def
?
very_important_function
(template:str,* variables,file:os.PathLike,engine:str,header:bool = True,debug:bool = False):?
“”將`variables`應(yīng)用于`template`并寫入`file ` “””
?
與
?打開(文件,?
'W'
)?
為
?F:?
...?
格式化后的代碼:
def
?
very_important_function
(?
模板:str,?
*變量,?
file:os.PathLike,?
引擎:str,?
header:bool = True,?
debug:bool = False,?
):?
“” “適用`variables`到`template`并寫入`file`。” “”
?
與
?打開(文件,?
“W”
)?
為
?F:?
...?
isort美化進(jìn)口部分代碼
Python開發(fā)中經(jīng)常需要導(dǎo)入第三方的模塊,往往這部分代碼混亂不堪,使用isort可以則可以美化這部分的代碼.isort可以按字母表順序?qū)mport進(jìn)行排序,自動(dòng)分成多個(gè)部分。
我們可以使用pipenv安裝black和isort:
pipenv
?安裝黑色isort -dev?
isort的效果示例,可以看下面的動(dòng)圖:
黑色和isort同時(shí)使用時(shí),兩者默認(rèn)配置不兼容,我們需要覆蓋isort配置,優(yōu)先以黑色的格式化為準(zhǔn)。可以通過setup.cfg文件并添如下配置來完成該任務(wù)。
[isort]
?
multi_line_output =
3
?
include_trailing_comma =
True
?
force_grid_wrap =
0
?
use_parentheses =
True
?
line_length =
88
?
flake8代碼風(fēng)格檢測(cè)
Flake8可以用來確保代碼遵循PEP8中定義的標(biāo)準(zhǔn)的Python編程約定,是Python的官方輔助代碼風(fēng)格檢測(cè)工具,lake8檢查規(guī)則靈活,支持集成額外插件(比如VIM,升華,PyCharm,VSC等都有其相關(guān)插件) ,擴(kuò)展性強(qiáng)。
其安裝也可以使用pipenv:
pipenv
?安裝flake8 -dev?
flake8的使用示例如下:
flake8 example.py的檢查結(jié)果:
flake8默認(rèn)會(huì)忽略一些約定(E,F(xiàn)),如果我們檢查所有約定:
flake8 - 選擇E,F(xiàn) example.py,結(jié)果:
和isort一樣,為了配合兼容黑色,需要在setup.cfg中額外配置:
[flake8]
?
ignore ?= E203,E266,E501,W503?
max-line-length ?=?
88
?
max-complexity ?=?
18
?
select ?= B,C,E,F(xiàn),W,T4?
mypy靜態(tài)類型
Mypy是Python中的可選靜態(tài)類型檢查器,可以用結(jié)合動(dòng)態(tài)(或 “鴨子”)類型和靜態(tài)類型優(yōu)點(diǎn)其他代碼的性能。通過Mypy將Python中的動(dòng)態(tài)類型便捷性和表現(xiàn)力的優(yōu)勢(shì)與靜態(tài)類型強(qiáng)系統(tǒng)和編譯時(shí)類型檢查相結(jié)合,并且生成原生代碼,支持通過Python VM運(yùn)行,可以沒有運(yùn)行時(shí)開銷的高性能運(yùn)行。在Python中使用靜態(tài)類型好處有:
可以使程序更易于理解和維護(hù);
可以幫助編譯時(shí)調(diào)試和發(fā)現(xiàn)錯(cuò)誤,減少測(cè)試和調(diào)試。
可以在代碼部署到生產(chǎn)環(huán)境之前就可以找到難以捕捉的錯(cuò)誤。
可以使用pipenv直接安裝Mypy:
pipenv
?安裝mypy -dev?
mypy動(dòng)態(tài)類型和靜態(tài)類型一個(gè)示例如下:
項(xiàng)目配置
默認(rèn)情況下,Mypy會(huì)遞歸檢查所有類型注釋的導(dǎo)入,這會(huì)導(dǎo)致庫不包含這些注釋時(shí)出錯(cuò)。需要修改mypy配置僅檢查當(dāng)前代碼運(yùn)行,并忽略沒有類型注釋的導(dǎo)入模塊。這也可以在設(shè)置。 CFG中設(shè)置:
[mypy]
?
files =項(xiàng)目,test?
ignore_missing_imports =
true
?
代碼測(cè)試
程序開發(fā)中,除了寫代碼外,另外一個(gè)重要的部分是單元測(cè)試.Python測(cè)試方面我們要介紹的工具有pytest。
可以使用pipenv添加測(cè)試工具包及擴(kuò)展:
pipenv?
安裝
?pytest pytest-cov?
--dev?
。Pytest框架可以讓編寫小測(cè)試變得容易,而且支持以擴(kuò)展的方式提供更加復(fù)雜的功能下面是pytest網(wǎng)站的一個(gè)簡(jiǎn)單示例:
#test_sample.py?
def
?
inc
(x)的內(nèi)容:?
return
?x +?
1
?
def
?
test_answer
():?
assert
?inc(
3
)==?
5
?
通過以下命令測(cè)試
pipenv?
運(yùn)行
?pytest?
結(jié)果如下:
pytest冠狀病毒是pytest的單元測(cè)試行覆蓋率的插件.pytets冠狀病毒的測(cè)試結(jié)果示例如下:
pytest還有很多的擴(kuò)展插件:
pytest-cov:?jiǎn)卧獪y(cè)試覆蓋率報(bào)告
pytest-django:對(duì)Django框架的單元測(cè)框架
pytest-ASYNCIO:對(duì)ASYNCIO的支持
pytest-twisted:對(duì)扭框架的單元測(cè)框架
pytest-instafail:發(fā)送錯(cuò)誤時(shí)報(bào)告錯(cuò)誤信息
pytest-bdd測(cè)試驅(qū)動(dòng)開發(fā)工具
pytest-konira測(cè)試驅(qū)動(dòng)開發(fā)工具
pytest-timeout:支持超時(shí)功能
pytest-pep8:支持PEP8檢查
pytest-flakes:結(jié)合pyflakes進(jìn)行代碼檢查
更多插件可以查看github pytest-dev組織下的項(xiàng)目。
項(xiàng)目配置
項(xiàng)目中,所有的測(cè)試都應(yīng)該放在測(cè)試目錄中,我需要給setup.cfg添加配置:
[tool:pytest]
?
testpaths = test?
單元覆蓋率的項(xiàng)目配置需要?jiǎng)?chuàng)建一個(gè)新文件.coveragerc返回應(yīng)用程序代碼的覆蓋率統(tǒng)計(jì)信息,配置示例如下:
[跑]?
source =項(xiàng)目?
[報(bào)告]?
exclude_lines =?
pragma
:?
沒有
?封面?
def
?__repr__?
如果
?
self
\ .debug?
引發(fā)
?AssertionError?
引發(fā)
?NotImplementedError?
如果為
?
0
:?
if
?__name__ == .__ main__:?
然后再工程中運(yùn)行一下命令,測(cè)試項(xiàng)目的覆蓋率
pipenv?
運(yùn)行
?pytest --cov --cov-fail-under = 100?
如果程序代碼的測(cè)試覆蓋率低于100%時(shí),就會(huì)報(bào)錯(cuò)。
Git pre-commit hook規(guī)范檢查
Git hook可以讓我們?cè)谔峤换蛲扑蜁r(shí)執(zhí)行檢查腳本,腳本可以配置對(duì)項(xiàng)目鏡像測(cè)試或者規(guī)范性檢查。運(yùn)行腳本。我們可以配置pre-commit hook允許輕松配置這些鉤子,下面.pre-commit-config。 YAML配置示例可以幫我們自動(dòng)做代碼規(guī)范化,包括isort檢查,黑檢查,flake8檢查,mypy靜態(tài)類型檢查,pytest測(cè)試,pytest冠狀病毒測(cè)試覆蓋率檢查:
repos:
?
-?
repo:
?local?
hooks:
?
-?
id:
?isort?
name:
?isort?
階段:
?[commit]?
語言:
?系統(tǒng)?
條目:
?pipenv run isort?
類型:
?[python]?
-?
id:
?黑?
名:
?黑?
階段:
?[commit]?
語言:
?系統(tǒng)?
入口:
?pipenv運(yùn)行黑色?
類型:
?[python]?
-?
id:
?flake8?
name:
?flake8?
階段:
?[commit]?
語言:
?系統(tǒng)?
入口:
?pipenv run flake8?
類型:
?[python]?
exclude:
?setup.py?
-?
id:
?mypy?
name:
?mypy?
階段:
?[commit]?
語言:
?系統(tǒng)?
入口:
?pipenv run mypy?
types:
?[python]?
pass_filenames:
?
false
?
-?
id:
?pytest?
name:
?pytest?
階段:
?[commit]?
語言:
?系統(tǒng)?
入口:
?pipenv run pytest?
類型:
?[蟒蛇]?
-?
id:
?pytest-cov?
name:
?pytest?
階段:
?[push]?
語言:
?系統(tǒng)?
入口:
?pipenv run pytest --cov --cov-fail-under =
100
?
種類型:
?[python]?
如果你需要跳過這些鉤子,你可以運(yùn)行g(shù)it commit --no-verify或git push --no-verify
18.11自動(dòng)創(chuàng)建項(xiàng)目
上面我們提到的Python項(xiàng)目應(yīng)該具備的工具集和配置,可以將其作為模版.cookiecutter的模版定義范例如下:
cookiecutter.json?
{?
“full_name”
:?
“Chongchong”
,?
“email”
:?
“chongchong@ijz.me”
,?
“project_name”
:?
“Python-Practice”
,?
“repo_name”
:?
“”
Python-Practice?
“,?
”project_short_description“
:?
”簡(jiǎn)單的Python開發(fā)練習(xí)示例。“
,?
”release_date“
:?
”2019-09-02“
,?
”年“
:?
”2019“
,?
”版本“
:?
”0.0.1“
?
}?
然后使用18.11自動(dòng)生成整改工程:
pipx
運(yùn)行
cookiecutter? ?Python-Practice?
cd Python-Practice?
git init?
安裝依賴項(xiàng)
pipenv?
安裝
?
--dev?
運(yùn)行pre-commit和pre-push hook:
pipenv?
運(yùn)行
?pre-commit install -t pre-commit?
pipenv?
run
?pre-commit install -t pre-push?
總結(jié)
本文我們介紹了在Python的項(xiàng)目開發(fā)時(shí)候必須要具備的一些開發(fā)測(cè)試檢查工具。通過這些可以自動(dòng)生成的Python項(xiàng)目,代碼風(fēng)格檢查,代碼測(cè)試等操作,可以幫助我們打造一個(gè)高效完美的Python的開發(fā)環(huán)境。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

