2025 超現代 Python 實用工具
在本文中,我們介紹了幾個現代化的 Python 工具,它們各自在提升開發效率、代碼質量和用戶體驗方面發揮著重要作用。uv 作為一個高效的 Python 版本管理工具,幫助開發者輕松管理復雜的開發環境;Ruff 通過其速度和易用性,顯著提升了代碼質量和開發效率;mypy 作為靜態類型檢查的領先工具,幫助開發者構建更可靠、易維護的代碼;Typer 則簡化了 CLI 應用程序的開發,結合 uv 的環境管理能力,進一步提升了項目配置和部署的便捷性;最后,Rich 通過美化終端輸出,為開發者提供了更直觀、美觀的調試和展示工具。
這些工具的結合使用,不僅能夠顯著提升個人開發者的工作效率,還能在團隊協作中發揮重要作用,幫助開發者更輕松地構建高質量的 Python 項目。隨著 Python 生態系統的不斷發展,這些工具將成為現代 Python 開發中不可或缺的一部分。
Python 3.11
Python 3.11 和 3.12 都在性能上有所提升,但我們選擇了 Python 3.11,因為 3.12 在一些流行的數據科學庫(如 NumPy、Pandas)中仍存在不穩定性,可能影響開發效率和代碼可靠性。
對于開發者來說,編程中很大一部分時間都花在了處理錯誤信息上。Python 3.11 在這方面做出了顯著改進,特別是引入了更智能的回溯機制。與以往版本相比,3.11 的回溯信息不僅會顯示錯誤發生的文件和行號,還會在代碼片段中明確標出錯誤的具體位置,甚至高亮顯示問題所在的行和列。這種改進大大簡化了調試過程,減少了排查錯誤的時間。
此外,Python 3.11 還優化了錯誤信息的可讀性,使得類型錯誤(TypeError)或屬性錯誤(AttributeError)等提示更加直觀和詳細,幫助開發者更快理解問題本質。這些改進不僅提升了開發效率,也降低了新手的學習門檻。
Python 3.11 在性能和錯誤處理上的改進,使其成為當前開發的理想選擇,顯著提升了開發者的工作效率和生活質量。
下面的代碼有一個錯誤。我們想為 data 的第一個元素賦值,但代碼卻引用了一個不存在的變量 datas:
data = [1, 4, 8]
# the variable datas does not exist!
datas[0] = 2
在 Python 3.10 之前的版本中,這會導致錯誤跟蹤,指出變量 datas 不存在:
$ uv run --python 3.9 --no-project mistake.py
Traceback (most recent call last):
File "/Users/adamgreen/data-science-south-neu/mistake.py", line 3, in <module>
datas[0] = 2
NameError: name 'datas' is not defined
Python 3.11 將其診斷向前推進了兩步,還提供了一種解決方案,即變量應改名為 data,并指出錯誤發生在哪一行:
$ uv run --python 3.11 --no-project mistake.py
Traceback (most recent call last):
File "/Users/adamgreen/data-science-south-neu/mistake.py", line 3, in <module>
datas[0] = 2
^^^^^
NameError: name 'datas' is not defined. Did you mean: 'data'?
uv
學習 Python 最難的是學會安裝和管理 Python。即使是資深開發人員,也會為管理 Python 的復雜性而苦惱,尤其是當 Python 不是他們的主要語言時。
圖片
uv[1] 是一個功能強大的 Python 版本管理工具,旨在簡化開發者在本地環境中管理和切換不同 Python 版本的過程。與傳統的 Python 版本管理工具(如 pyenv、miniconda 或通過下載安裝程序手動安裝 Python)相比,uv 提供了一種更加高效和便捷的解決方案。
圖片
主要功能
- Python 版本管理:uv 允許用戶輕松安裝、切換和管理多個 Python 版本。無論是 Python 3.7、3.8 還是最新的 3.12 版本,uv 都能快速響應并下載所需的版本。
- 自動下載與安裝:當用戶運行指定 Python 版本的命令或腳本時,如果該版本尚未安裝,uv 會自動下載并安裝所需的 Python 版本。這一功能極大地簡化了開發環境的配置過程,避免了手動下載和安裝的繁瑣步驟。
- 跨平臺支持:uv 支持多種操作系統,包括 Windows、macOS 和 Linux,確保開發者可以在不同的平臺上使用相同的工具來管理 Python 版本。
- 輕量級與高效:uv 的設計注重性能,啟動速度快,資源占用低,能夠在不影響系統性能的情況下高效管理多個 Python 版本。
優勢
- 簡化復雜性:uv 通過自動化 Python 版本的下載和安裝,大大減少了開發者在配置開發環境時的工作量。
- 靈活性:uv 不僅支持管理 Python 版本,還可以與現有的虛擬環境工具(如 virtualenv 或 venv)結合使用,提供更加靈活的開發環境管理方案。
- 社區支持:uv 是一個開源工具,擁有活躍的社區支持,開發者可以通過社區獲取幫助、分享經驗,并參與工具的改進。
下面的命令使用 Python 3.12 運行 "hello world" 程序:
$ uv run --python 3.12 --no-project python -c "print('hello world')"
hello
uv 也是一個用 Python 管理虛擬環境的工具。它是 venv 或 miniconda 的替代工具。虛擬環境允許不同的 Python 安裝并存,這樣就可以在本地處理不同的項目。
下面的命令創建了一個 Python 3.11 的虛擬環境:
$ uv venv --python 3.11
Using CPython 3.11.10
Creating virtual environment at: .venv
Activate with: source .venv/bin/activate
你需要使用 $ source activate .venv/bin 激活虛擬環境。
uv 也是一個管理 Python 依賴關系和軟件包的工具。它是 pip 的替代品。Pip、Poetry 和 uv 都可以用來安裝和升級 Python 軟件包。
下面是一個 uv 管理項目的示例 pyproject.toml:
[project]
name = "hypermodern"
version = "0.0.1"
requires-python = ">=3.11,<3.12"
dependencies = [
"pandas>=2.0.0",
"requests>=2.31.0"
]
[project.optional-dependencies]
test = ["pytest>=7.0.0"]
將 uv pip install 指向我們的 pyproject.toml 即可安裝項目:
$ uv pip install -r pyproject.toml
Resolved 11 packages in 1.69s
Installed 11 packages in 61ms
+ certifi==2024.12.14
+ charset-normalizer==3.4.0
+ idna==3.10
+ numpy==2.2.0
+ pandas==2.2.3
+ python-dateutil==2.9.0.post0
+ pytz==2024.2
+ requests==2.32.3
+ six==1.17.0
+ tzdata==2024.2
+ urllib3==2.2.3
和 Poetry 一樣,uv 可以將依賴關系鎖定到 uv.lock:
$ uv lock
Resolved 17 packages in 5ms
uv 也可以用來添加工具,即全局可用的 Python 工具。下面的命令安裝了 pytest 工具,我們可以在任何地方使用它:
$ uv tool install --python 3.11 pytest
Resolved 4 packages in 525ms
Installed 4 packages in 7ms
+ inicnotallow==2.0.0
+ packaging==24.2
+ pluggy==1.5.0
+ pytest==8.3.4
Installed 2 executables: py.test, pytest
這將添加虛擬環境外可用的程序:
$ which pytest
/Users/adamgreen/.local/bin/pytest
Tips: 在 direnv 工具中添加 .envrc,以便在進入目錄時自動切換到正確的 Python 版本。
ruff
Ruff[2] 是一個現代化的、高性能的 Python 代碼檢查和格式化工具,旨在為開發者提供一種更快、更高效的代碼質量保障方案。作為 Black、autopep8、Flake8 和 isort 等傳統工具的替代品,Ruff 憑借其獨特的設計和強大的功能,正在成為 Python 開發者工具箱中的重要一員。
核心特點
- 極速性能:Ruff 的最大亮點是其卓越的性能。由于它是用 Rust 語言編寫的,Ruff 在代碼分析和格式化方面的速度遠超許多基于 Python 的工具。無論是小型項目還是大型代碼庫,Ruff 都能在幾秒內完成代碼檢查和格式化,顯著提升了開發效率。
- 全面的規則覆蓋:Ruff 不僅支持 Flake8 規則集的大部分內容,還整合了 isort 等其他工具的規則。這意味著開發者可以通過 Ruff 一次性完成代碼風格檢查、語法錯誤檢測、導入排序等多種任務,而無需依賴多個工具。
- 高度可配置:Ruff 提供了靈活的配置選項,允許開發者根據項目需求自定義規則集和行為。無論是啟用或禁用特定規則,還是調整格式化風格,Ruff 都能輕松滿足不同團隊和項目的需求。
- 輕量級與易集成:Ruff 的設計注重簡潔和易用,無需復雜的依賴或配置即可快速集成到現有項目中。它支持與常見的開發工具(如 VS Code、PyCharm 等)和 CI/CD 流水線無縫集成,幫助開發者在整個開發周期中保持代碼質量。
優勢
- 速度與效率:Ruff 的極速性能使其在處理大型代碼庫時表現出色,顯著減少了等待時間,提升了開發體驗。
- 多功能一體化:Ruff 集成了多種工具的功能,避免了開發者需要在不同工具之間切換的麻煩,簡化了工作流程。
- 現代化設計:基于 Rust 的實現不僅帶來了性能上的優勢,還使 Ruff 更加穩定和可靠,適合現代開發環境的需求。
與現有工具的對比
- 與 Black 相比:Ruff 不僅提供了代碼格式化功能,還集成了代碼檢查的能力,功能更加全面。
- 與 Flake8 相比:Ruff 的速度更快,且支持更多的規則集,同時避免了 Flake8 需要安裝多個插件的復雜性。
- 與 isort 相比:Ruff 可以直接處理導入排序問題,而無需額外安裝和配置 isort。
圖片
下面的代碼有三個問題:
- 我們使用了一個未定義的變量 datas。
- 導入的位置不對。
- 導入了我們不用的東西。
data = datas[0]
import collections
在同一目錄下運行 Ruff 會發現問題:
$ ruff check .
ruff.py:1:8: F821 Undefined name `datas`
ruff.py:2:1: E402 Module level import not at top of file
ruff.py:2:8: F401 [*] `collections` imported but unused
Found 3 errors.
[*] 1 potentially fixable with the --fix option.
Tips: 在開發過程中,Ruff 在保存文件時運行足夠快--確保在文本編輯器中配置了保存時的格式設置
mypy
mypy[3] 是一個強大的靜態類型檢查工具,專門為 Python 設計,旨在通過引入類型注解和類型檢查機制,提升代碼的可靠性和可維護性。它允許開發者在 Python 中實現類型安全,從而減少運行時錯誤,并提高代碼的可讀性和可維護性。與傳統的動態類型 Python 開發方式不同,mypy 提供了一種更接近靜態類型語言的開發體驗,類似于 TypeScript 對 JavaScript 的增強。
圖片
核心功能
- 類型注解支持:mypy 允許開發者在 Python 代碼中使用類型注解(Type Annotations),例如變量、函數參數和返回值的類型聲明。這些注解不僅提高了代碼的可讀性,還為靜態類型檢查提供了基礎。
- 靜態類型檢查:mypy 在代碼運行之前對類型注解進行靜態分析,檢查類型是否一致。它可以捕捉到許多在運行時才會暴露的錯誤,例如類型不匹配、未定義的屬性調用等。
- 漸進式類型:mypy 支持漸進式類型系統,這意味著開發者可以逐步為現有代碼添加類型注解,而不需要一次性重構整個代碼庫。這種靈活性使得 mypy 非常適合在大型項目或已有項目中引入類型檢查。
- 與 Python 生態系統的兼容性:mypy 完全兼容 Python 的標準庫和第三方庫,并且支持許多流行的 Python 框架(如 Django、Flask 等)。此外,mypy 還可以與 IDE(如 VS Code、PyCharm)集成,提供實時的類型檢查反饋。
優勢
- 提前發現錯誤:mypy 在代碼運行之前就能捕捉到類型相關的錯誤,避免了運行時崩潰或異常。
- 提高代碼可讀性:類型注解使代碼的意圖更加清晰,開發者可以更容易理解函數和類的輸入輸出類型。
- 增強開發工具支持:mypy 與主流 IDE 和編輯器的集成,提供了實時的類型檢查和自動補全功能,顯著提升了開發效率。
- 漸進式采用:mypy 允許開發者逐步引入類型注解,無需一次性重構整個代碼庫,降低了采用的門檻。
mypy_error.py 有一個問題--我們試圖將一個字符串除以 10:
def process(user):
# line below causes an error
user['name'] / 10
user = {'name': 'alpha'}
process(user)
我們可以通過運行 mypy 來捕獲這個錯誤--捕獲錯誤而不實際執行 Python 代碼:
$ mypy --strict mypy_error.py
mypy_error.py:1: error: Function is missing a type annotation
mypy_error.py:5: error: Call to untyped function "process" in typed context
Found 2 errors in 1 file (checked 1 source file)
第一個錯誤是因為我們的代碼沒有類型化 - 我們可以添加兩個類型注解,使我們的代碼類型化:
- user: dict[str,str] - user 是一個以字符串為鍵和值的字典、
- -> None: - process 函數返回 None。
def process(user: dict[str,str]) -> None:
user['name'] / 10
user = {'name': 'alpha'}
process(user)
在 mypy_intermediate.py 上運行 mypy,mypy 指出了代碼中的錯誤:
$ mypy --strict mypy_intermediate.py
mypy_fixed.py:2: error: Unsupported operand types for / ("str" and "int")
Found 1 error in 1 file (checked 1 source file)
這是一個無需編寫任何特定測試邏輯即可運行的測試。
Tips: 在調試類型問題時,在代碼中使用 reveal_type(變量)。mpy 會向你顯示它認為變量的類型。
Typer
Typer[4] 是一個基于 Python 類型提示構建命令行界面 (CLI) 的強大工具,旨在為開發者提供一種更簡潔、更直觀的方式來創建命令行應用程序。與傳統的 sys.argv 或 argparse 相比,Typer 充分利用了 Python 的類型注解功能,使得 CLI 的開發更加高效和易于維護。
圖片
核心特點
- 基于類型提示:Typer 使用 Python 的類型注解(Type Hints)來定義命令行參數和選項,使得代碼更加清晰和類型安全。
- 自動生成幫助文檔:Typer 會根據類型注解自動生成命令行幫助文檔,開發者無需手動編寫復雜的幫助信息。
- 簡潔的 API:Typer 的 API 設計非常簡潔,開發者只需幾行代碼即可實現復雜的命令行功能。
- 強大的子命令支持:Typer 支持嵌套子命令,使得開發者可以輕松構建復雜的命令行工具。
- 與 Click 的兼容性:Typer 基于 Click 構建,因此完全兼容 Click 的功能,同時提供了更現代化的開發體驗。
優勢
- 開發效率高:Typer 的簡潔 API 和自動生成幫助文檔的功能顯著提升了開發效率。
- 代碼可讀性強:基于類型提示的代碼更加清晰和易于理解。
- 類型安全:Typer 的類型檢查功能可以在開發階段捕捉到潛在的錯誤,減少運行時問題。
首先創建一個虛擬環境:
$ uv venv --pythnotallow=3.11.10
Using CPython 3.11.10
Creating virtual environment at: .venv
Activate with: source .venv/bin/activate
然后使用 uv init 從頭開始創建一個新項目:
$ uv init --name demo --python 3.11.10 --package
Initialized project `demo`
這樣就創建了一個項目:
$ tree
.
├── pyproject.toml
├── README.md
└── src
└── demo
└── __init__.py
然后,我們可以使用 uv add 將 typer 添加為依賴關系:
$ uv add typer
Using CPython 3.11.10
Creating virtual environment at: .venv
Resolved 10 packages in 2ms
Installed 8 packages in 9ms
+ click==8.1.8
+ markdown-it-py==3.0.0
+ mdurl==0.1.2
+ pygments==2.18.0
+ rich==13.9.4
+ shellingham==1.5.4
+ typer==0.15.1
+ typing-extensinotallow==4.12.2
然后,我們添加修改 Python 文件 src/demo/__init__.py,使其包含一個簡單的 CLI:
import typer
app = typer.Typer()
@app.command()
def main(name: str) -> None:
print(f"Hello {name}")
我們需要將此添加到 pyproject.toml 中,以便使用 demo 命令運行 CLI:
demo = "demo:app"
這是完整的 pyproject.toml:
[project]
name = "demo"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
authors = [
{ name = "Adam Green", email = "adam.green@adgefficiency.com" }
]
requires-python = ">=3.11.10"
dependencies = [
"typer>=0.15.1",
]
[project.scripts]
demo = "demo:app"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
由于我們在 pyproject.toml 中包含了 [project.scripts],因此可以使用 uv run 運行此 CLI:
$ uv run demo omega
Hello omega
Typer 為我們免費提供了“--help ”標志:
$ python src/demo/__init__.py --help
Usage: demo [OPTIONS] NAME
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────╮
│ * name TEXT [default: None] [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────╮
│ --install-completion Install completion for the current shell. │
│ --show-completion Show completion for the current shell, to copy it or customize │
│ the installation. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────╯
Tips: 你可以在 Typer 中使用命令和命令組創建嵌套的 CLI 組。
Rich
Rich[5] 是一個功能強大的 Python 庫,專門用于在終端中輸出美觀、格式化的文本內容。它通過豐富的樣式、顏色、表格、進度條等功能,徹底改變了傳統 Python 程序單調乏味的終端輸出方式,為開發者提供了一種更加直觀和優雅的展示方式。無論是調試信息、日志記錄,還是數據展示,Rich 都能讓你的終端輸出煥然一新。
圖片
核心功能
- 豐富的文本樣式:Rich 支持多種文本樣式,包括顏色、粗體、斜體、下劃線、背景色等。開發者可以輕松地為終端輸出添加視覺層次,使其更具可讀性和吸引力。
- 表格輸出:Rich 提供了強大的表格功能,支持自動調整列寬、對齊方式、邊框樣式等。無論是展示數據還是生成報告,Rich 的表格功能都能讓信息更加清晰和結構化。
- 進度條:Rich 內置了多種進度條樣式,支持實時更新和多任務進度跟蹤。這對于長時間運行的任務(如數據處理、文件下載等)非常有用,能夠直觀地展示任務進度。
- 語法高亮:Rich 支持代碼片段的語法高亮,能夠自動識別多種編程語言(如 Python、JSON、Markdown 等),并在終端中以彩色形式展示代碼。
- Markdown 渲染:Rich 可以直接在終端中渲染 Markdown 文檔,支持標題、列表、代碼塊、鏈接等 Markdown 語法,使得文檔展示更加美觀。
- 日志格式化:Rich 提供了高度可定制的日志格式化功能,開發者可以為日志添加顏色、時間戳、調用棧信息等,使得日志記錄更加直觀和易于分析。
優勢
- 提升可讀性:Rich 的豐富樣式和顏色使得終端輸出更加直觀和易于理解。
- 簡化開發:Rich 提供了簡單易用的 API,開發者只需幾行代碼即可實現復雜的終端輸出效果。
- 高度可定制:Rich 支持多種自定義選項,開發者可以根據需求調整輸出樣式和格式。
- 跨平臺支持:Rich 在 Windows、macOS 和 Linux 上都能完美運行,確保開發者可以在不同平臺上獲得一致的體驗。
Rich 的特點是打印出漂亮的顏色和表情符號:
import rich
user = {'name': 'omega', 'id': 'invalid'}
print(f" normal printing\nuser {user}\n")
rich.print(f" :wave: rich printing\nuser {user}\n")
normal printing
user {'name': 'omega', 'id': 'invalid'}
?? rich printing
user {'name': 'omega', 'id': 'invalid'}
Features
如果你對 Rich 感興趣,可以用 Rich 打印代替內置打印,從而簡化代碼:
from rich.console import Console
from rich.table import Table
from rich.progress import track
import time
# 創建 Console 對象
console = Console()
# 輸出彩色文本
console.print("[bold red]Hello, [green]Rich[/green]![/bold red]")
# 創建表格
table = Table(title="示例表格")
table.add_column("ID", justify="right", style="cyan")
table.add_column("名稱", style="magenta")
table.add_column("描述", style="green")
table.add_row("1", "Python", "一種流行的編程語言")
table.add_row("2", "Rich", "一個終端美化工具")
console.print(table)
# 進度條示例
for i in track(range(10), descriptinotallow="處理中..."):
time.sleep(0.5)
此外,Rich 有一個檢查功能,可以對任何 Python 對象(例如類、實例或內置對象)生成報告。
my_list = ["foo", "bar"]
from rich import inspect
inspect(my_list, methods=True)
日志
Tips: Rich 提供了比顏色和表情符號更多的功能,包括顯示表格數據和更好的 Python 錯誤回溯。
寫在最后
最后我們對本次分享做個總結:
uv 是一個現代化的 Python 版本管理工具,通過其自動化、高效和跨平臺的特點,幫助開發者更輕松地管理復雜的 Python 開發環境。無論是個人開發者還是團隊,uv 都能顯著提升開發效率和環境配置的便捷性。
Ruff 是一個集速度、功能和易用性于一體的 Python 代碼工具,適合希望提升代碼質量和開發效率的開發者。無論是個人項目還是團隊協作,Ruff 都能成為你的得力助手,幫助你更輕松地編寫高質量的 Python 代碼。
mypy 作為 Python 靜態類型檢查的領先工具,正在幫助開發者構建更可靠、更易維護的代碼。隨著 Python 社區對靜態類型的接受度不斷提高,mypy 將成為現代 Python 開發中不可或缺的一部分。
Typer 是一個現代化的 Python CLI 開發工具,通過其簡潔的 API 和強大的類型提示功能,幫助開發者快速構建高效、易維護的命令行應用程序。結合 uv 的環境管理能力,開發者可以更輕松地配置和部署 Python 項目。無論是個人項目還是團隊工具,Typer 都能顯著提升開發效率和代碼質量。
Rich 是一個現代化的 Python 終端美化工具,通過其豐富的功能和簡潔的 API,幫助開發者以更美觀、更直觀的方式展示終端輸出。無論是調試信息、數據展示,還是日志記錄,Rich 都能顯著提升終端輸出的質量和用戶體驗。如果你厭倦了單調的終端輸出,Rich 無疑是你的理想選擇。
參考資料
[1]uv: https://docs.astral.sh/uv/
[2]Ruff: https://docs.astral.sh/ruff/
[3]mypy: http://www.mypy-lang.org/
[4]Typer: https://typer.tiangolo.com/
[5]Rich: https://rich.readthedocs.io/en/stable/