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

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
