常用python編程軟件推薦:python編程軟件用哪個好

在開始一個新的Python項目時,很容易不做規劃直接進入編碼環節。花費少量時間,用最好的工具設置項目,將節省大量時間並帶來更快樂的編碼體驗。

在理想的世界中,所有開發人員使用的依賴庫都是相同的,代碼將被完美地格式化,禁止常見錯誤,並且測試將涵蓋所有內容。此外,每次提交代碼時都會確保符合這些要求。

在本文中,我將介紹如何設置一個這樣的理想項目。你可以跟隨我的步驟操作,也可以直接開始安裝pipx和pipenv,然後生成新項目。

讓我們創建一個新的項目目錄:

mkdir best_practices
cd best_practices

Python命令行工具與pipx

Pipx是一個方便的實用程序,允許快速安裝python命令行工具。我們將用它來安裝 pipenv 和 cookiecutter 。

python3 -m pip install --user pipx
python3 -m pipx ensurepath

使用 pipenv 進行依賴管理

Pipenv自動為您的項目創建和管理virtualenv,以及在安裝/卸載軟件包時從Pipfile添加/刪除軟件包。它還生成了非常重要的Pipfile.lock文件,用於生成確定性構建。

知道你和你的同事正在使用相同的庫版本,可以極大提升信心。Pipenv 可以實現這個點,因此在過去一年多里得到了大量開發者的青睞

pipx install pipenv

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

Black是代碼格式化工具:

Black是不妥協的Python代碼格式化程序。通過使用它,意味着您同意放棄對手動格式化細節的控制。作為回報,Black 為你提供速度和確定性,並且無需處理 pycodestyle 的繁瑣提示。你將有更多的時間,來處理更重要的事情。

無論是什麼項目,Black 格式化後的代碼看起來都是一樣的。習慣之後,你不會再注意到格式的問題,可以專註於內容。

Black產生的代碼差異最小,可以加速代碼審查。

isort則用來處理 import 的排序:

isort是可以按字母順序對 import 進行排序,並自動分成多個部分。

讓我們使用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的約定。使用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

現在我們可以使用 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,test
ignore_missing_imports=
true

現在我們可以運行mypy:

pipenv run mypy

mypy 的速查表:
https://mypy.readthedocs.io/en/latest/cheatsheetpy3.html

「乾貨」推薦一整套 Python 開發工具

使用pytest和pytest-cov進行測試

使用pytest編寫測試非常容易,並且消除編寫測試的阻力,意味着我們會編寫更多的測試!

pipenv install pytest pytest-cov --dev

以下是pytest網站的一個簡單示例:

# content of test_sample.py
def
 inc(x):
 
return
 x + 
1
def
 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
) == 
5
E 
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

如果對應用程序代碼的測試覆蓋率低於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

「乾貨」推薦一整套 Python 開發工具

使用cookiecutter生成項目

我們已經看到了理想項目都使用了哪些工具,可以將其固化為一個模板,只需要1個命令 即可生成新項目:

pipx run cookiecutter gh:sourceryai/python-best-practices-cookiecutter

填寫項目名稱和倉庫名稱,即可使用模板為你生成項目。

要完成設置,請按照下列步驟操作:

# Enter project directory
cd 
<repo_name>
# Initialise git repo
git init
# Install dependencies
pipenv install --dev
# Setup pre-commit and pre-push hooks
pipenv run pre-commit install -t pre-commit
pipenv run pre-commit install -t pre-push

模板項目包含一個非常簡單的Python文件和測試來試用這些工具。一旦你對代碼感到滿意,你就可以做第一個 git commit,這時所有的鉤子都會運行。

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/217405.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-09 00:27
下一篇 2024-12-09 00:27

相關推薦

發表回復

登錄後才能評論