搜尋
首頁後端開發Python教學建立一個完美的Python項目
建立一個完美的Python項目Sep 29, 2020 pm 04:39 PM
Python直譯項目

python影片教學專欄為大家介紹如何建立一個完美的Python專案。

建立一個完美的Python項目

當開始一個新的 Python 專案時,大家很容易一頭栽進去就開始編碼。其實花一點時間選擇優秀的函式庫,將為日後的開發節省大量時間,並帶來更快樂的程式設計體驗。

在理想世界中,所有開發人員的關係是相互依賴和關聯的(協作開發),程式碼要有完美的格式、沒有低階的錯誤、並且測試覆蓋了所有程式碼。另外,所有這些將在每次提交時都可以保證。 (程式碼風格統一、類型偵測、測試覆蓋率高、自動偵測)

在本文中,我將介紹如何建立一個可以做到這些點的專案。您可以按照步驟操作,也可以直接跳到 使用 cookiecutter 生成項目 部分(老手)。 首先,讓我們建立一個新的專案目錄:

mkdir best_practices
cd best_practices复制代码

pipx 安裝 Python 三方程式庫的命令列工具

Pipx 是一個可用來快速安裝 Python 三方程式庫的命令列工具。我們將使用它來安裝 pipenv 和 cookiecutter。透過下面的命令安裝pipx:

python3 -m pip install --user pipx
python3 -m pipx ensurepath复制代码

使用pipenv 進行依賴管理

Pipenv 為您的專案自動建立和管理virtualenv(虛擬環境),並在安裝/卸載軟體包時從Pipfile 新增/移除軟體包。它還會產生非常重要的 Pipfile.lock 用於確保依賴的可靠性。

當你知道,你和你的隊友正在使用相同的函式庫版本時,這將會大大提高程式設計的信心和樂趣。 Pipenv 很好地解決了使用相同的函式庫,版本不同的這個問題,Pipenv 在過去的一段時間裡獲得了廣泛的關注和認可,你可以放心使用。安裝指令如下:

pipx install pipenv复制代码

使用black 和isort 進行程式碼格式化

black 可以格式化我們的程式碼:

Black 是毫不妥協的Python 程式碼格式化庫。透過使用它,你將放棄手動調整程式碼格式的細節。作為回報,Black 可以帶來速度、確定性和避免調整 Python 程式碼風格的煩惱,從而有更多的精力和時間放在更重要的事情上。

無論你正在閱讀什麼樣的項目,用 black 格式化過的程式碼看起來都差不多。一段時間後格式不再是問題,這樣你就可以更專注於內容。

black 透過減少程式碼的差異性,使程式碼檢查更快。

而isort 是對我們的imports 部分進行排序:

isort 為您導入的Python 套件部分(imports)進行排序,因此您不必再對imports 進行手動排序。它可以按字母順序對導入進行排序,並自動將其拆分成多個部分。

使用pipenv 安裝它,以便它們不會使部署混亂(可以指定只在開發環境安裝):

pipenv install black isort --dev复制代码

Black 和isort 並不相容的預設選項,因此我們將讓isort 遵循black 的原則。建立一個setup.cfg 檔案並新增以下設定:

[isort]
multi_line_output=3
include_trailing_comma=True
force_grid_wrap=0
use_parentheses=True
line_length=88复制代码

我們可以使用以下命令執行這些工具:

pipenv run black
pipenv run isort复制代码

使用flake8 保證程式碼風格

Flake8 確保程式碼遵循PEP8 中定義的標準Python 程式碼規格。使用 pipenv 安裝:

pipenv install flake8 --dev复制代码

就像 isort 一樣,它需要一些設定才能很好地與 black 配合使用。將這些配置加入到 setup.cfg

[flake8]
ignore = E203, E266, E501, W503
max-line-length = 88
max-complexity = 18
select = B,C,E,F,W,T4复制代码

現在我們可以執行 flake8 了,指令:pipenv run flake8

使用 mypy 進行靜態類型檢查

Mypy 是 Python 的非強制的靜態類型檢查器,旨在結合動態(或 “鴨子”)類型和靜態類型的優點。 Mypy 將 Python 的表達能力和便利性與功能強大的類型系統的編譯時類型檢查結合在一起,使用任何 Python VM 運行它們,基本上沒有運行時開銷。

在 Python 中使用類型需要一點時間來適應,但是好處卻是巨大的。如下:

  • 靜態類型可以使程式更易於理解和維護
  • 靜態類型可以幫助您更早發現錯誤,並減少測試和偵錯的時間
  • 靜態類型可以幫助您在程式碼投入生產之前發現難以發現的錯誤
pipenv install mypy --dev复制代码

預設情況下,Mypy 將遞歸檢查所有導入包的類型註釋,當庫不包含這些註釋時,就會報錯。我們需要將 mypy 配置為僅在我們的程式碼上運行,並忽略沒有類型註解的導入錯誤。我們假設我們的程式碼位於以下配置的 best_practices 套件中。將此添加到 setup.cfg

[mypy]files=best_practices,testignore_missing_imports=true复制代码

現在我們可以運行 mypy 了:

pipenv run mypy复制代码

這是一個有用的 備忘單 。

用 pytest 和 pytest-cov 进行测试

使用 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.y
cachedir: $PYTHON_PREFIX/.pytest_cache
rootdir: $REGENDOC_TMPDIR
collected 1 item

test_sample.py F                                                     [100%]

================================= FAILURES =================================
_______________________________ test_answer ________________________________

    def test_answer():>       assert inc(3) == 5E       assert 4 == 5
E        +  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复制代码

--cov-fail-under=100 是设定项目的测试覆盖率如果小于 100% 那将认定为失败。

pre-commit 的 Git hooks

Git hooks 可让您在想要提交或推送时随时运行脚本。这使我们能够在每次提交/推送时,自动运行所有检测和测试。pre-commit 可轻松配置这些 hooks。

Git hook 脚本对于在提交代码审查之前,识别简单问题很有用。我们在每次提交时都将运行 hooks,以自动指出代码中的问题,例如缺少分号、尾随空白和调试语句。通过在 code review 之前指出这些问题,代码审查者可以专注于变更的代码内容,而不会浪费时间处理这些琐碎的样式问题。

在这里,我们将上述所有工具配置为在提交 Python 代码改动时执行(git commit),然后仅在推送时运行 pytest coverage(因为测试要在最后一步)。创建一个新文件 .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复制代码

如果需要跳过这些 hooks,可以运行 git commit --no-verifygit push --no-verify

使用 cookiecutter 生成项目

现在,我们已经知道了理想项目中包含了什么,我们可以将其转换为 模板 从而可以使用单个命令生成一个包含这些库和配置的新项目:

pipx run cookiecutter gh:sourcery-ai/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-commit
pipenv run pre-commit install -t pre-push复制代码

模板项目包含一个非常简单的 Python 文件和测试,可以试用上面这些工具。在编写完代码觉得没问题后,就可以执行第一次 git commit,所有的 hooks 都将运行。

集成到编辑器

虽然在提交时知道项目的代码始终保持最高水准是件令人兴奋的事情。但如果在代码已全部修改完成之后(提交时),再发现有问题还是会让人很不爽。所以,实时暴露出问题要好得多。

在保存文件时,花一些时间确保代码编辑器运行这些命令。有及时的反馈,这意味着你可以在代码还有印象的时候能迅速解决引入的任何小问题。

我个人使用一些出色的 Vim 插件来完成此任务:

  • ale 实时运行 flake8 并在保存文件时运行 black、isort 和 mypy
  • 与 projectionist 集成的 vim-test 在文件保存上运行 pytest

欢迎热爱技术和开源的小伙伴加入 HG 推出的译文亦舞系列的翻译中来,可以留言告诉我们。

更多相关免费学习推荐:python视频教程

以上是建立一個完美的Python項目的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:juejin。如有侵權,請聯絡admin@php.cn刪除
如何解決Linux終端中查看Python版本時遇到的權限問題?如何解決Linux終端中查看Python版本時遇到的權限問題?Apr 01, 2025 pm 05:09 PM

Linux終端中查看Python版本時遇到權限問題的解決方法當你在Linux終端中嘗試查看Python的版本時,輸入python...

我如何使用美麗的湯來解析HTML?我如何使用美麗的湯來解析HTML?Mar 10, 2025 pm 06:54 PM

本文解釋瞭如何使用美麗的湯庫來解析html。 它詳細介紹了常見方法,例如find(),find_all(),select()和get_text(),以用於數據提取,處理不同的HTML結構和錯誤以及替代方案(SEL)

如何使用TensorFlow或Pytorch進行深度學習?如何使用TensorFlow或Pytorch進行深度學習?Mar 10, 2025 pm 06:52 PM

本文比較了Tensorflow和Pytorch的深度學習。 它詳細介紹了所涉及的步驟:數據準備,模型構建,培訓,評估和部署。 框架之間的關鍵差異,特別是關於計算刻度的

Python中的數學模塊:統計Python中的數學模塊:統計Mar 09, 2025 am 11:40 AM

Python的statistics模塊提供強大的數據統計分析功能,幫助我們快速理解數據整體特徵,例如生物統計學和商業分析等領域。無需逐個查看數據點,只需查看均值或方差等統計量,即可發現原始數據中可能被忽略的趨勢和特徵,並更輕鬆、有效地比較大型數據集。 本教程將介紹如何計算平均值和衡量數據集的離散程度。除非另有說明,本模塊中的所有函數都支持使用mean()函數計算平均值,而非簡單的求和平均。 也可使用浮點數。 import random import statistics from fracti

哪些流行的Python庫及其用途?哪些流行的Python庫及其用途?Mar 21, 2025 pm 06:46 PM

本文討論了諸如Numpy,Pandas,Matplotlib,Scikit-Learn,Tensorflow,Tensorflow,Django,Blask和請求等流行的Python庫,並詳細介紹了它們在科學計算,數據分析,可視化,機器學習,網絡開發和H中的用途

如何使用Python創建命令行接口(CLI)?如何使用Python創建命令行接口(CLI)?Mar 10, 2025 pm 06:48 PM

本文指導Python開發人員構建命令行界面(CLIS)。 它使用Typer,Click和ArgParse等庫詳細介紹,強調輸入/輸出處理,並促進用戶友好的設計模式,以提高CLI可用性。

在Python中如何高效地將一個DataFrame的整列複製到另一個結構不同的DataFrame中?在Python中如何高效地將一個DataFrame的整列複製到另一個結構不同的DataFrame中?Apr 01, 2025 pm 11:15 PM

在使用Python的pandas庫時,如何在兩個結構不同的DataFrame之間進行整列複製是一個常見的問題。假設我們有兩個Dat...

解釋Python中虛擬環境的目的。解釋Python中虛擬環境的目的。Mar 19, 2025 pm 02:27 PM

文章討論了虛擬環境在Python中的作用,重點是管理項目依賴性並避免衝突。它詳細介紹了他們在改善項目管理和減少依賴問題方面的創建,激活和利益。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),