
文 | Brendan Maginnis 譯 | EarlGrey
在開始一個新的Python項目時,很容易不做規劃直接進入編碼環節。花費少量時間,用最好的工具設定項目,将節省大量時間并帶來更快樂的編碼體驗。
在理想的世界中,所有開發人員使用的依賴庫都是相同的,代碼将被完美地格式化,禁止常見錯誤,并且測試将涵蓋所有内容。此外,每次送出代碼時都會確定符合這些要求。
在本文中,我将介紹如何設定一個這樣的理想項目。你可以跟随我的步驟操作,也可以直接開始安裝pipx和pipenv,然後生成新項目。
讓我們建立一個新的項目目錄:
Python指令行工具與pipx
Pipx是一個友善的實用程式,允許快速安裝python指令行工具。我們将用它來安裝 pipenv 和 cookiecutter 。
使用 pipenv 進行依賴管理
Pipenv自動為您的項目建立和管理virtualenv,以及在安裝/解除安裝軟體包時從Pipfile添加/删除軟體包。它還生成了非常重要的Pipfile.lock檔案,用于生成确定性建構。
知道你和你的同僚正在使用相同的庫版本,可以極大提升信心。Pipenv 可以實作這個點,是以在過去一年多裡得到了大量開發者的青睐
使用 black 和 isort 進行代碼格式化
Black是代碼格式化工具:
Black是不妥協的Python代碼格式化程式。通過使用它,意味着您同意放棄對手動格式化細節的控制。作為回報,Black 為你提供速度和确定性,并且無需處理 pycodestyle 的繁瑣提示。你将有更多的時間,來處理更重要的事情。 無論是什麼項目,Black 格式化後的代碼看起來都是一樣的。習慣之後,你不會再注意到格式的問題,可以專注于内容。 Black産生的代碼差異最小,可以加速代碼審查。
isort則用來處理 import 的排序:
isort是可以按字母順序對 import 進行排序,并自動分成多個部分。
讓我們使用pipenv安裝它們為開發依賴庫,這樣就不會讓部署版本變得更複雜:
Black 和 isort 的預設選項之間有沖突,是以我們将覆寫 isort 的選項配置,使用 Black 的配置。建立一個 <code>setup.cfg</code>檔案并添加此配置:
我們可以這樣運作這些工具:
用flake8強化風格
Flake8確定我們的代碼遵循PEP8的約定。使用pipenv安裝:
就像isort一樣,它需要一些配置才能與 Black 配合使用。将此配置添加到 <code>setup.cfg</code>:
現在我們可以使用 <code>pipenv run flake8</code>運作flake8。
使用 mypy 檢查靜态類型
Mypy是Python的一個可選靜态類型檢查器,旨在結合動态(或“鴨子”)類型和靜态類型的好處。Mypy将Python的表現力和便利性與強大的類型系統和編譯時類型檢查相結合。Mypy對标準Python程式進行類型檢查,使用 Python VM 運作 mypy 基本沒有運作時的開銷。
在Python中使用類型需要慢慢習慣,但好處是巨大的。mypy 官網這樣寫道:
靜态類型可以使程式更容易了解和維護
靜态類型可以幫助您更早地發現錯誤,并減少測試和調試
靜态類型可以幫助您在代碼投入生産之前找到難以發現的錯誤
預設情況下,Mypy将遞歸檢查所有類型注釋的導入,這會導緻庫不包含這些注釋時出錯。我們需要将mypy配置為僅在我們的代碼上運作,并忽略沒有類型注釋的導入的任何錯誤。我們假設代碼存在于以下配置的 <code>best_practices</code>包中。将如下配置添加到 <code>setup.cfg</code>:
現在我們可以運作mypy:
mypy 的速查表:https://mypy.readthedocs.io/en/latest/cheatsheetpy3.html
使用pytest和pytest-cov進行測試
使用pytest編寫測試非常容易,并且消除編寫測試的阻力,意味着我們會編寫更多的測試!
以下是pytest網站的一個簡單示例:
執行示例:
所有的測試都應該放在 <code>test</code>目錄中,是以将這個配置添加到 <code>setup.cfg</code>:
我們還想檢查測試覆寫了多少代碼。建立一個新檔案 <code>.coveragerc</code>,用來傳回應用程式代碼的覆寫率統計資訊,我們再次假設代碼位于 <code>best_practices</code>子產品中:
我們現在可以運作測試并報告覆寫率
如果對應用程式代碼的測試覆寫率低于100%,則會失敗。
pre-commit 的 Git 鈎子
Git鈎子允許您在任何時候送出或推送時運作腳本。這就可以支援我們在每次送出/推送時,自動運作所有的格式化和測試。pre-commit可以幫助我們輕松配置這些鈎子:
在送出代碼審查之前,Git鈎子腳本可以幫助識别簡單問題。每次送出時運作鈎子,自動指出代碼中的問題,例如缺少分号,尾随空格和調試語句。在代碼審查之前指出這些問題,可以讓代碼審查者專注于代碼架構的變化,而不是浪費時間檢查格式問題。
在這裡,我們配置在送出Python 檔案修改時,執行上述所有檢查,并且僅在推送時運作pytest覆寫率測試,因為耗時可能較長。建立一個新檔案 <code>.pre-commit-config.yaml</code>:
如果你需要跳過這些鈎子,你可以運作 <code>git commit--no-verify</code>或 <code>git push--no-verify</code>
使用cookiecutter生成項目
我們已經看到了理想項目都使用了哪些工具,可以将其固化為一個模闆,隻需要1個指令 即可生成新項目:
填寫項目名稱和倉庫名稱,即可使用模闆為你生成項目。
要完成設定,請按照下列步驟操作:
模闆項目包含一個非常簡單的Python檔案和測試來試用這些工具。一旦你對代碼感到滿意,你就可以做第一個 <code>git commit</code>,這時所有的鈎子都會運作。<code></code>