名称: python
描述: Python 编码规范与最佳实践。适用于编写、审查或重构 Python 代码。强制执行 PEP 8 风格,通过 py_compile 进行语法验证,执行单元测试,仅支持现代 Python 版本(无 EOL 版本),优先使用 uv 进行依赖管理,并遵循地道的 Pythonic 模式。
# 语法检查(必须执行)
python -m py_compile *.py
# 运行测试(如果存在)
python -m pytest tests/ -v 2>/dev/null || python -m unittest discover -v 2>/dev/null || echo "未找到测试"
# 格式检查(如果工具可用)
ruff check . --fix 2>/dev/null || python -m black --check . 2>/dev/null
优先使用 uv,其次使用 pip:
# 优先使用 uv(如果已安装)
if command -v uv &>/dev/null; then
uv pip install <package>
uv pip compile requirements.in -o requirements.txt
else
pip install <package>
fi
新项目使用 uv 初始化:uv init 或 uv venv && source .venv/bin/activate
# ✅ 优先使用列表/字典推导式而非循环
squares = [x**2 for x in range(10)]
lookup = {item.id: item for item in items}
# ✅ 使用上下文管理器管理资源
with open("file.txt") as f:
data = f.read()
# ✅ 解包操作
first, *rest = items
a, b = b, a # 交换变量
# ✅ 遵循 EAFP 而非 LBYL
try:
value = d[key]
except KeyError:
value = default
# ✅ 使用 f-string 进行格式化
msg = f"你好 {name},你有 {count} 个物品"
# ✅ 使用类型提示
def process(items: list[str]) -> dict[str, int]:
...
# ✅ 使用 dataclasses/attrs 定义数据容器
from dataclasses import dataclass
@dataclass
class User:
name: str
email: str
active: bool = True
# ✅ 优先使用 pathlib 而非 os.path
from pathlib import Path
config = Path.home() / ".config" / "app.json"
# ✅ 善用 enumerate、zip、itertools
for i, item in enumerate(items):
...
for a, b in zip(list1, list2, strict=True):
...
# ❌ 可变默认参数
def bad(items=[]): # 错误:会在多次调用间共享
...
def good(items=None):
items = items or []
# ❌ 捕获所有异常的 except
try:
...
except: # 会捕获 SystemExit、KeyboardInterrupt 等
...
except Exception: # 更合适
...
# ❌ 全局状态
# ❌ from module import *
# ❌ 在循环中进行字符串拼接(应使用 join)
# ❌ 使用 == None(应使用 `is None`)
# ❌ 使用 len(x) == 0(应使用 `not x`)
test_*.py,测试函数命名为 test_*python -m pytest -vdef fetch_user(user_id: int, include_deleted: bool = False) -> User | None:
"""根据 ID 从数据库获取用户。
参数:
user_id: 用户的唯一标识符。
include_deleted: 如果为 True,则包含已软删除的用户。
返回:
如果找到则返回 User 对象,否则返回 None。
抛出:
DatabaseError: 数据库连接失败时抛出。
"""
py_compile)pytest).format() 或 %pathlib