其他
在 Python 中需要类型注解、泛型…
适用于给现有或新 Python 代码添加类型提示、实现泛型类、定义结构化接口、配置 mypy/pyright,以及构建类型安全 API/库时。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 48/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 56/100 ×0.15
适用场景
在 Python 中需要类型注解、泛型、通用
解决思路
- 为核心概念落地:为函数参数、返回值和变量声明预期类型。
- 用泛型编写可复用代码,在不同类型之间保留类型信息。
- 用 protocols 定义结构化接口,不依赖继承,实现带类型安全的鸭子类型。
- 用守卫和条件语句做类型收窄,在代码块内缩小类型范围。
- 在返回类型中显式表达可能不存在,如 `def get_user(user_id: str) -> User | None`。
- 让类型检查器强制处理 None 分支,如 `if user is None: raise UserNotFoundError(...)` 后再访问 `user.name`。
- 为所有公共函数、方法和类添加类型注解。
- 为公共 API 签名标注类型,如 `get_user(user_id: str) -> User`、`process_batch(items: list[Item], max_workers: int = 4) -> BatchResult[ProcessedItem]`。
- 为类的 `__init__` 和方法标注类型,如 `__init__(self, db: Database) -> None`、`async def find_by_id(self, user_id: str) -> User | None`、`async def save(self, user: User) -> User`。
- 在 CI 中使用 `mypy --strict` 或 `pyright` 早期捕获类型错误。
- 对现有项目使用 per-module overrides 逐步启用严格模式。
- Python 3.10+ 优先使用现代联合语法,如 `User | None`、`int | float | str`。
- 需要兼容 Python 3.9 时使用旧式 `from typing import Optional, Union` 和 `Optional[User]`。
- 使用条件语句帮助类型检查器收窄类型:先处理 None 分支或抛出异常。
- 在处理 `list[Item | None]` 时,用 `[item for item in items if item is not None]` 过滤并收窄为 `list[Item]`,再处理每个 item。
- 使用 `TypeVar` 和 `Generic` 创建类型安全的可复用容器。
- 定义类型变量,如 `T = TypeVar('T')`,并用 `E = TypeVar('E', bound=Exception)` 限定异常类型。
- 实现 `Result(Generic[T, E])` 这类容器,保存 `value: T | None` 或 `error: E | None`。
- 在泛型容器中校验 value 和 error 恰好设置一个,否则抛出 `ValueError`。
- 为泛型容器提供 `is_success`、`is_failure`、`unwrap()`、`unwrap_or(default)` 等操作;`unwrap()` 在错误时抛出错误,`unwrap_or()` 返回默认值。
- 在泛型容器使用处保留类型,如 `parse_config(path: str) -> Result[Config, ConfigError]`,成功分支 `unwrap()` 得到 `Config`。
- 当本摘要不足时,阅读 `references/details.md` 获取高级模式和详细示例。
- 标注所有公共 API:函数、方法、类属性。
- 优先使用 `T | None` 而不是 `Optional[T]`。
- 在 CI 中运行严格类型检查:`mypy --strict`。
- 使用泛型在可复用代码中保留类型信息。
- 定义 protocols 实现结构化类型接口。
- 使用守卫收窄类型,帮助类型检查器。
- 为类型变量设置 bound,把泛型限制在有意义的类型上。
- 为复杂类型创建类型别名,提供有意义的名称。
- 尽量减少 `Any`:使用具体类型或泛型;仅在真正动态数据或与无类型第三方代码交互时接受 `Any`。
- 用类型作为可执行文档:让类型注解记录并校验接口。
适用边界 · 注意事项
- 需要兼容 Python 3.9 及以下时,不要使用 `T | None` 现代联合语法,应改用 `Optional[T]` / `Union[...]`。
- 数据真正动态或与无类型第三方代码交互时,不要强行消除 `Any`;此时 `Any` 可接受。