文章插圖

文章插圖
在開始一個新的Python項目時,很容易不做規劃直接進入編碼環節 ?;ㄙM少量時間,用最好的工具設置項目,將節省大量時間并帶來更快樂的編碼體驗 。
在理想的世界中,所有開發人員使用的依賴庫都是相同的,代碼將被完美地格式化,禁止常見錯誤,并且測試將涵蓋所有內容 。此外,每次提交代碼時都會確保符合這些要求 。
在本文中,我將介紹如何設置一個這樣的理想項目 。你可以跟隨我的步驟操作,也可以直接開始安裝pipx和pipenv,然后生成新項目 。
讓我們創建一個新的項目目錄:
mkdir best_practicescd best_practicesPython命令行工具與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 的繁瑣提示 。你將有更多的時間,來處理更重要的事情 。isort則用來處理 import 的排序:
無論是什么項目,Black 格式化后的代碼看起來都是一樣的 。習慣之后,你不會再注意到格式的問題,可以專注于內容 。
Black產生的代碼差異最小,可以加速代碼審查 。
isort是可以按字母順序對 import 進行排序,并自動分成多個部分 。讓我們使用pipenv安裝它們為開發依賴庫,這樣就不會讓部署版本變得更復雜:
pipenv install black isort --devBlack 和 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 mypymypy 的速查表:https://mypy.readthedocs.io/en/latest/cheatsheetpy3.html
使用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
我們已經看到了理想項目都使用了哪些工具,可以將其固化為一個模板,只需要1個命令 即可生成新項目:
pipx run cookiecutter gh:sourceryai/python-best-practices-cookiecutter填寫項目名稱和倉庫名稱,即可使用模板為你生成項目 。
要完成設置,請按照下列步驟操作:
# Enter project directorycd <repo_name># 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編程工具哪個好 python好用的編寫軟件】模板項目包含一個非常簡單的Python文件和測試來試用這些工具 。一旦你對代碼感到滿意,你就可以做第一個 git commit,這時所有的鉤子都會運行 。
- 哪個牌子平板電腦好 十大平板電腦品牌排行榜
- 爬蟲淘寶商品信息python 淘寶商家信息爬蟲
- 櫻花節 河南櫻花節是哪個城市
- 榮耀中端手機哪個好 中端手機哪個好用
- 打開我的電腦快捷鍵是哪個 我的電腦鍵盤快捷鍵
- 手機相冊文件管理夾在那 手機相冊在哪個文件夾?
- 電腦解壓軟件哪個好用 免費的電腦解壓軟件哪個好
- 寶葫蘆的秘密 寶葫蘆是哪個鬼片
- arcgis哪個版本 arcgis最高版本是什么
- 美的壓力鍋質量好嗎 美的哪個電壓力鍋性價比高
