plugins/languages/python/skills/types/SKILL.md
Python 类型注解与类型安全规范。涵盖 PEP 604/612/646/695 现代语法、Pydantic v2 模型、ty/pyright 严格模式、泛型/协议/Literal。在添加类型注解、修复类型检查报错、设计数据模型、写泛型代码、配置 typeCheckingMode 时使用。也触发于"类型注解"、"类型检查"、"Pydantic"、"mypy/pyright/ty 报错"。
npx skillsauth add lazygophers/ccplugin python-typesInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Python 3.13+, ty Beta / pyright strict。所有公共函数必须有完整注解, 私有函数依逻辑复杂度判断。
| 工具 | 何时用 | |------|--------| | pyright (strict) | 默认首选, 98% spec conformance, VS Code 集成最好 | | ty (Astral) | 新项目 + 已用 uv/ruff, 速度 10-60x mypy, Beta 期 (2026) 与 pyright 并存于 CI | | mypy (strict) | 老项目维护期, 或依赖 mypy 插件 (django-stubs, sqlalchemy stubs) |
不要在同一项目混用 mypy + pyright 配置, 选一个为 CI 真相源。
PEP 585 / 604 / 695, Python 3.13+ 默认可用:
# 内置泛型 (PEP 585) - 不要 from typing import List
def parse(items: list[str]) -> dict[str, int]: ...
# Union 语法 (PEP 604) - 不要 Optional[X] / Union[A, B]
def find(uid: int) -> User | None: ...
def coerce(x: int | str | None) -> str: ...
# 类型别名 (PEP 695) - 不要 TypeAlias
type UserId = int
type JSON = dict[str, "JSON"] | list["JSON"] | str | int | float | bool | None
# 泛型函数 (PEP 695) - 不要 TypeVar
def first[T](items: list[T]) -> T | None:
return items[0] if items else None
# 泛型类 (PEP 695)
class Stack[T]:
def __init__(self) -> None:
self._items: list[T] = []
def push(self, item: T) -> None: ...
def pop(self) -> T: ...
携带运行时约束 (Pydantic / FastAPI 会读取):
from typing import Annotated
from pydantic import Field
UserName = Annotated[str, Field(min_length=3, max_length=50)]
Port = Annotated[int, Field(ge=1, le=65535)]
from typing import Literal, Final, TypedDict
Status = Literal["pending", "active", "deleted"]
MAX_CONN: Final[int] = 100
class UserDict(TypedDict):
id: int
name: str
email: str
替代 ABC, 不需要继承关系:
from typing import Protocol
class SupportsClose(Protocol):
def close(self) -> None: ...
def cleanup(resource: SupportsClose) -> None:
resource.close()
数据校验首选, 不要手写 __init__ 做校验:
from pydantic import BaseModel, ConfigDict, EmailStr, Field
from typing import Annotated
class UserCreate(BaseModel):
model_config = ConfigDict(
str_strip_whitespace=True,
frozen=True,
extra="forbid",
)
username: Annotated[str, Field(min_length=3, max_length=50)]
email: EmailStr
age: Annotated[int, Field(ge=0, le=150)]
# v2 API
user = UserCreate.model_validate({"username": "alice", "email": "[email protected]", "age": 20})
data = user.model_dump() # 不是 .dict()
json_str = user.model_dump_json() # 不是 .json()
不再用 @validator, 改用 @field_validator / @model_validator。
| 场景 | 选择 |
|------|------|
| 内部数据容器, 无校验 | @dataclass(slots=True, frozen=True) |
| API 边界, 需要 JSON + 校验 | Pydantic v2 |
| 极致性能 (序列化热路径) | msgspec.Struct (比 Pydantic 快 5-10x) |
| 老代码维护 | attrs (保留即可, 新代码不用) |
pyproject.toml:
[tool.pyright]
typeCheckingMode = "strict"
pythonVersion = "3.13"
reportMissingTypeStubs = "warning"
reportUnknownMemberType = "warning"
# 或 ty
[tool.ty.rules]
# ty 默认检查所有代码, 包括无注解函数体
| 报错 | 修复 |
|------|------|
| Argument of type "X \| None" cannot be assigned to "X" | 加 if x is None: ... 或 assert x is not None |
| Object of type "None" is not subscriptable | 同上 |
| Type "X" is partially unknown | 给变量显式注解或修复源头泛型 |
| Cannot access member "x" for type "Y" | 检查 import / 是否漏了 stub (uv add --dev types-xxx) |
from typing import List, Dict, Tuple, Optional, Union (用内置泛型 + |)Any 当万能逃生口 (改用 object + isinstance 收窄, 或 TypeVar)# type: ignore 不带具体规则名 (写 # type: ignore[arg-type]).dict(), .parse_obj(), @validator)typing.get_type_hints() 做业务逻辑 (PEP 649 后行为变了, 改用 Pydantic)tools
UI/UX 与布局设计——做界面布局/结构/导航/组件/交互的设计决策。触发:做UI/UX/布局/排版/导航/组件/交互/栅格/响应式/图表选型/字体配对。按媒介路由 HTML/Web、原生 App(iOS/Android/桌面)、CLI、TUI。需后端动态系统不适用;配色/主题/色板走姊妹 skill design-color。
tools
主题与配色设计——做颜色搭配/调色板/主题/品牌色阶/暗模式的设计决策。触发:选配色/调色/主题/色板/品牌色/暗模式/对比度/色盲/UI风格。按媒介路由 HTML/Web(CSS变量)、原生App(平台token)、CLI(ANSI)、TUI(真彩/256/16降级)。保证可访问性(对比度/色盲安全)。需后端动态系统不适用;UI/UX 布局/组件/交互走姊妹 skill design-uiux。
tools
跨任意组件(plugin/skill/agent/command)的验证驱动优化循环纪律 skill。当用户要优化某个已有组件却无明确方向、或要防止改了反而更差(自评乐观偏差 / 多维同改归因失效 / 为凑分加废话膨胀)、或要把一套通用「评分→单变量改→改后验证严格更好才留否则回滚→触顶停」的纪律套到任意组件上时使用。管优化过程本身的纪律(validation gate / ratchet / 独立验证 / 触顶停),不评单组件深度(交 skill-dev),不查插件接线(交 plugin-dev)。仅手动 /optimize-any 触发。
data-ai
两层规则记忆 (基于 .skein/spec)。planning 时 recall 召回相关规则、task finish 后 sediment 沉淀学习 + prune 自动精简过期/重复/断链规则。core 常驻硬规 + recall 按需召回, 经判定门自动写盘 (不逐次问用户)。产出 .skein/spec 下 core/recall 规则文件 + index。另支持空仓 bootstrap 播种规则基线、记忆大面积失效 (大重构/换栈) 时 reconstruct 可逆归档后按项目类型分型重建、maintain 手动体检 (超预算/stale/断链/重复/废弃, --apply 自动修复)、auto-fix (Stop hook 写 .pending-fix 标记 → main 派 skein-specer bg 跑 maintain --apply 全自动修, 断链只报告)。