关于 fix-types
一项指导 Python 项目修复 mypy 类型错误的开发技能。它要求先分组错误,再逐项提出修复方案并等待确认,同时强调清晰的类型转换和运行时错误处理。
主要功能
- 01运行 mypy 检查类型错误
- 02将错误归纳分组
- 03逐项征求修复确认
- 04优先使用 cast()
- 05为必要的 type: ignore 添加说明
- 06处理 Django 延迟翻译字符串类型
适用场景
- 01按步骤修复项目中的 mypy 错误
- 02在修改前审核每项类型修复方案
- 03为 Django 延迟翻译字符串添加类型注解
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ saaspegasus/ django-skills --skill fix-types安装后在 Claude Code 中输入/fix-types确认已加载。
详细介绍
您的任务
要修复类型问题,请执行以下操作。
- 首先运行类型检查器,查看有哪些问题:
uv run mypy . - 将发现的错误归类到逻辑分组中。
- 对于每组错误,逐一检查错误,告诉我您想采用的修复方案,然后询问我在继续之前是否有任何问题或建议。
- 只有在我批准后,才应用修复并继续处理该组中的下一个错误。
- 完成一组错误后,询问我是否要继续处理下一组。
优先使用 cast(),而不是 type: ignore
当 mypy 无法推断出正确类型时,优先使用 cast(),而不是 # type: ignore:
# Preferred - documents the expected type
choices = cast(list[tuple[str, str]], field.choices)
# Avoid when cast is possible - just silences the error
choices = list(field.choices) # type: ignore[arg-type]
原因: cast() 会明确说明您期望的类型,让代码更易读、更易维护。它也不会屏蔽同一行上的其他潜在错误。
检查空值时,优先使用恰当的错误,而不是断言
添加空值检查以满足 mypy 要求时,优先抛出恰当的异常,而不是使用 assert:
# Preferred - proper error handling
if obj.related_field is None:
raise ValueError("Object must have a related field")
result = obj.related_field.some_method()
# Avoid - assertions can be disabled with -O flag
assert obj.related_field is not None
result = obj.related_field.some_method()
原因: 在生产环境中,python -O 可以禁用断言,因此断言不能可靠地用于运行时验证。恰当的异常可确保检查始终执行,并提供更好的错误处理。
使用 type: ignore 时,添加注释
如果必须使用 type: ignore(例如,mypy 对有效代码的限制),请务必添加简短说明:
# Good - explains why the ignore is needed
self.tier = tier # type: ignore[misc] # mypy can't handle Enum tuple values with custom __init__
# Bad - no explanation
self.tier = tier # type: ignore[misc]
Django 惰性翻译字符串的类型提示
对 Django 的惰性翻译字符串(gettext_lazy)使用类型提示时,请采用以下模式,以避免 mypy 报错,同时确保代码在生产环境中正常运行(生产环境不会安装 django-stubs-ext):
from __future__ import annotations # Must be the first import
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from django_stubs_ext import StrOrPromise
# Then use StrOrPromise in type hints
def my_function(name: StrOrPromise) -> StrOrPromise: ...
class MyData:
title: StrOrPromise
description: StrOrPromise
采用此模式的原因:
from __future__ import annotations会让类型注解在运行时成为字符串(而非进行求值)if TYPE_CHECKING:可确保该导入只在类型检查期间执行,而不会在运行时执行django-stubs-ext是开发依赖项,生产环境中不会提供- 此模式允许接受普通字符串和惰性翻译字符串
评论
支持 Markdown