91在线一级黄片|91视频在线观看18|成人夜间呦呦网站|91资源欧美日韩超碰|久久最新免费精品视频一区二区三区|国产探花视频在线观看|黄片真人免费三级片毛片|国产人无码视频在线|精品成人影视无码三区|久久视频爱久久免费精品

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
Python開(kāi)發(fā)必備:如何建立一個(gè)優(yōu)秀的項(xiàng)目工程環(huán)境

 在程序開(kāi)發(fā)時(shí)候一套好的開(kāi)發(fā)環(huán)境和工具棧,可以幫我們極大的提高開(kāi)發(fā)的效率,避免把大量時(shí)間浪費(fèi)在周邊瑣事上。本文以Python為例,教大家如何快速打造優(yōu)秀的Python項(xiàng)目開(kāi)發(fā)環(huán)境:內(nèi)容涵蓋了模塊依賴(là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及以上版本:

 
 
 
 
  1. python3 -m pip install --user pipx 
  2. python3 -m pipx ensurepath 

升級(jí)Pipx使用:

 
 
 
 
  1. python3 -m pip install -U pipx 

包依賴(lài)管理pipenv

Pipenv會(huì)自動(dòng)為你的項(xiàng)目創(chuàng)建和管理虛擬環(huán)境,以pipfile文件方式方式管理項(xiàng)目的依賴(lài)包,支持包的安裝和卸載。和requirements.txt不同,pipfile是TOML格式,支持開(kāi)發(fā)環(huán)境與正式環(huán)境,還可以使用Pipfile.lock鎖定環(huán)境版本。pipxenv的安裝可以使用pipx:

 
 
 
 
  1. pipx install pipenv 

有些發(fā)行版也是可以直接通過(guò)其包管理器安裝的:

比如MacOS可以下可以使用:

 
 
 
 
  1. brew install pipenv 

一個(gè)pipfile的示例如下:

Pipfile.lock的示例部分如下:

代碼風(fēng)格

代碼格式化black

代碼格式的統(tǒng)一不光可以給我們一個(gè)愜意的代碼格式,而且可以避免由于開(kāi)發(fā)人員之間的代碼風(fēng)格差異導(dǎo)致的溝通和協(xié)作問(wèn)題。

Black就是用來(lái)格式化Python代碼的程序。它可以自動(dòng)幫我們對(duì)代碼格式進(jìn)行調(diào)整和統(tǒng)一,提高代碼效率和可讀性。而且通過(guò)Black減小代碼風(fēng)格的差異,可以極大提高團(tuán)隊(duì)進(jìn)行代碼審查的效率。

一個(gè)Black格式化示例如下:

原始代碼:

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

格式化后的代碼:

 
 
 
 
  1. def very_important_function( 
  2. template: str, 
  3. *variables, 
  4. file: os.PathLike, 
  5. engine: str, 
  6. header: bool = True, 
  7. debug: bool = False, 
  8. ): 
  9. """Applies `variables` to the `template` and writes to `file`.""" 
  10. with open(file, "w") as f: 
  11. ... 

isort美化import部分代碼

Python開(kāi)發(fā)中經(jīng)常需要import第三方的模塊,往往這部分代碼混亂不堪,使用isort可以則可以美化這部分的代碼。 isort可以按字母表順序?qū)mport進(jìn)行排序,自動(dòng)分成多個(gè)部分。

我們可以使用pipenv安裝black 和isort:

 
 
 
 
  1. pipenv install black isort -dev 

isort的效果示例,可以看下面的動(dòng)圖:

Black和isort同時(shí)使用時(shí),兩者默認(rèn)配置不兼容,我們需要覆蓋isort配置,優(yōu)先以Black的格式化為準(zhǔn)。可以通過(guò)setup.cfg文件并添如下配置來(lái)完成該任務(wù)。

 
 
 
 
  1. [isort] 
  2. multi_line_output=3 
  3. include_trailing_comma=True 
  4. force_grid_wrap=0 
  5. use_parentheses=True 
  6. line_length=88 

flake8代碼風(fēng)格檢測(cè)

Flake8可以用來(lái)確保代碼遵循PEP8中定義的標(biāo)準(zhǔn)Python編程約定,是Python官方輔助代碼風(fēng)格檢測(cè)工具,lake8檢查規(guī)則靈活,支持集成額外插件(比如vim、sublime、PyCharm、vsc等都有其相關(guān)插件),擴(kuò)展性強(qiáng)。

其安裝也可以使用pipenv:

 
 
 
 
  1. pipenv install flake8 –dev 

flake8的使用示例如下:

flake8 example.py的檢查結(jié)果:

flake8默認(rèn)會(huì)忽略一些約定(E,F(xiàn)),如果我們檢查所有約定:

flake8 --select E,F example.py,結(jié)果:

和isort一樣,為了配合兼容Black,需要在setup.cfg中額外配置:

 
 
 
 
  1. [flake8] 
  2. ignore = E203, E266, E501, W503 
  3. max-line-length = 88 
  4. max-complexity = 18 
  5. select = B,C,E,F,W,T4 

mypy靜態(tài)類(lèi)型

Mypy是Python的可選靜態(tài)類(lèi)型檢查器,可以用結(jié)合動(dòng)態(tài)(或"鴨子")類(lèi)型和靜態(tài)類(lèi)型優(yōu)點(diǎn)其他代碼的性能。通過(guò)Mypy將Python的動(dòng)態(tài)類(lèi)型便捷性和表現(xiàn)力的優(yōu)勢(shì)與靜態(tài)類(lèi)型強(qiáng)系統(tǒng)和編譯時(shí)類(lèi)型檢查相結(jié)合,并且生成原生代碼,支持通過(guò)Python VM運(yùn)行,可以沒(méi)有運(yùn)行時(shí)開(kāi)銷(xiāo)的高性能運(yùn)行。在Python中使用靜態(tài)類(lèi)型好處有:

可以使程序更易于理解和維護(hù);

可以幫助編譯時(shí)調(diào)試和發(fā)現(xiàn)錯(cuò)誤,減少測(cè)試和調(diào)試。

可以在代碼部署到生產(chǎn)環(huán)境之前就可以找到難以捕捉的錯(cuò)誤。

可以使用pipenv直接安裝Mypy:

 
 
 
 
  1. pipenv install mypy –dev 

mypy動(dòng)態(tài)類(lèi)型和靜態(tài)類(lèi)型一個(gè)示例如下:

項(xiàng)目配置

默認(rèn)情況下,Mypy會(huì)遞歸檢查所有類(lèi)型注釋的導(dǎo)入,這會(huì)導(dǎo)致庫(kù)不包含這些注釋時(shí)出錯(cuò)。需要修改mypy配置僅檢查當(dāng)前代碼運(yùn)行,并忽略沒(méi)有類(lèi)型注釋的import模塊。這也可以在setup.cfg中設(shè)置:

 
 
 
 
  1. [mypy] 
  2. files=項(xiàng)目,test 
  3. ignore_missing_imports=true 

代碼測(cè)試

程序開(kāi)發(fā)中,除了寫(xiě)代碼外,另外一個(gè)重要的部分是單元測(cè)試。Python測(cè)試方面我們要介紹的工具有pytest。

可以使用pipenv添加測(cè)試工具包及擴(kuò)展:

 
 
 
 
  1. pipenv install pytest pytest-cov --dev 

Pytest框架可以讓編寫(xiě)小測(cè)試變得容易,而且支持以擴(kuò)展的方式提供更加復(fù)雜的功能。下面是pytest網(wǎng)站的一個(gè)簡(jiǎn)單示例:

 
 
 
 
  1. # content of test_sample.py 
  2. def inc(x): 
  3. return x + 1 
  4. def test_answer(): 
  5. assert inc(3) == 5 

通過(guò)以下命令測(cè)試

 
 
 
 
  1. pipenv run pytest 

結(jié)果如下:

pytest-cov是pytest的單元測(cè)試行覆蓋率的插件。pytets-cov的測(cè)試結(jié)果示例如下:

pytest還有很多的擴(kuò)展插件:

pytest-cov: 單元測(cè)試覆蓋率報(bào)告

pytest-django: 對(duì)Django框架的單元測(cè)框架

pytest-asyncio:對(duì)asyncio的支持

pytest-twisted: 對(duì)twisted框架的單元測(cè)框架

pytest-instafail: 發(fā)送錯(cuò)誤時(shí)報(bào)告錯(cuò)誤信息

pytest-bdd 測(cè)試驅(qū)動(dòng)開(kāi)發(fā)工具

pytest-konira 測(cè)試驅(qū)動(dòng)開(kāi)發(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)該放在test目錄中,我需要給setup.cfg添加配置:

 
 
 
 
  1. [tool:pytest] 
  2. testpaths=test 

單元覆蓋率的項(xiàng)目配置需要?jiǎng)?chuàng)建一個(gè)新文件.coveragerc返回應(yīng)用程序代碼的覆蓋率統(tǒng)計(jì)信息,配置示例如下:

 
 
 
 
  1. [run] 
  2. source = 項(xiàng)目 
  3. [report] 
  4. exclude_lines = 
  5. pragma: no cover 
  6. def __repr__ 
  7. if self\.debug 
  8. raise AssertionError 
  9. raise NotImplementedError 
  10. if 0: 
  11. if __name__ == .__main__.: 

然后再工程中運(yùn)行一下命令,測(cè)試項(xiàng)目的覆蓋率

 
 
 
 
  1. pipenv run pytest --cov --cov-fail-under =100 

如果程序代碼的測(cè)試覆蓋率低于100%,就會(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檢查、black檢查、flake8檢查、mypy靜態(tài)類(lèi)型檢查、pytest測(cè)試、pytest-cov測(cè)試覆蓋率檢查:

 
 
 
 
  1. repos: 
  2. - repo: local 
  3. hooks: 
  4. - id: isort 
  5. name: isort 
  6. stages: [commit] 
  7. language: system 
  8. entry: pipenv run isort 
  9. types: [python] 
  10. - id: black 
  11. name: black 
  12. stages: [commit] 
  13. language: system 
  14. entry: pipenv run black 
  15. types: [python] 
  16. - id: flake8 
  17. name: flake8 
  18. stages: [commit] 
  19. language: system 
  20. entry: pipenv run flake8 
  21. types: [python] 
  22. exclude: setup.py 
  23. - id: mypy 
  24. name: mypy 
  25. stages: [commit] 
  26. language: system 
  27. entry: pipenv run mypy 
  28. types: [python] 
  29. pass_filenames: false 
  30. - id: pytest 
  31. name: pytest 
  32. stages: [commit] 
  33. language: system 
  34. entry: pipenv run pytest 
  35. types: [python] 
  36. - id: pytest-cov 
  37. name: pytest 
  38. stages: [push] 
  39. language: system 
  40. entry: pipenv run pytest --cov --cov-fail-under=100 
  41. types: [python] 

如果你需要跳過(guò)這些鉤子,你可以運(yùn)行g(shù)it commit --no-verify或git push --no-verify

cookiecutter自動(dòng)創(chuàng)建項(xiàng)目

上面我們提到Python項(xiàng)目應(yīng)該具備的工具集和配置,可以將其作為模版。cookiecutter的模版定義范例如下:

 
 
 
 
  1. cookiecutter.json

  2. "full_name": "Chongchong", 
  3. "email": "chongchong@ijz.me", 
  4. "project_name": "Python-Practice", 
  5. "repo_name": ""Python-Practice ", 
  6. "project_short_description": "The Simple Python Development Practice Example.", 
  7. "release_date": "2019-09-02", 
  8. "year": "2019", 
  9. "version": "0.0.1" 

然后使用cookiecutter自動(dòng)生成整改工程:

 
 
 
 
  1. pipx run cookiecutter Python-Practice 
  2. cd Python-Practice 
  3. git init 

安裝依賴(lài)項(xiàng)

 
 
 
 
  1. pipenv install --dev 

運(yùn)行 pre-commit和pre-push hook:

 
 
 
 
  1. pipenv run pre-commit install -t pre-commit 
  2. pipenv run pre-commit install -t pre-push 

總結(jié)

本文我們介紹了在Python項(xiàng)目開(kāi)發(fā)時(shí)候必須要具備的一些開(kāi)發(fā)測(cè)試檢查工具。通過(guò)這些可以自動(dòng)生成Python項(xiàng)目,代碼風(fēng)格檢查、代碼測(cè)試等操作,可以幫助我們打造一個(gè)高效完美的Python開(kāi)發(fā)環(huán)境。


當(dāng)前文章:Python開(kāi)發(fā)必備:如何建立一個(gè)優(yōu)秀的項(xiàng)目工程環(huán)境
網(wǎng)址分享:http://m.jiaoqi3.com/article/dppeeih.html