报告源类型和目标类型不相关的 typing.cast 调用。
当源类型既不是目标类型的子类型,目标类型也不是源类型的子类型时,将报告错误。
此类转换通常指示逻辑错误,因为一种类型的实例不能被假定为另一种类型的实例,并且 typing.cast 不会动态验证类型。
此检查甚至适用于理论上可能具有共同后代的类型。
例如,它将标记两个同级类 Left 和 Right 之间的转换,因为它们都继承自 Top,但彼此之间没有直接继承关系。
示例:
from typing import cast
# 非重叠类型 — 可能是错误
cast(int, "a") # 'str' -> 'int'
cast(list[int], ["a"]) # 'list[str]' -> 'list[int]'
# 推荐的显式逃生舱口是使用“双重转换”
cast(int, cast(object, "a")) # 正确
# 合法的重叠情况
cast(int, object()) # 有效的向下转换
cast(object, 1) # 有效的向上转换
# 默认情况下,会忽略泛型类型实参的变体,因此,尽管 list 是不变的,
# 也不会报告以下情况
int_list = [1, 2, 3]
cast(list[object], int_list) # 正确
该检查依赖于静态类型信息;当类型未知时,不会报告警告。
使用忽略泛型类型实参的差异选项可控制是否考虑泛型类型实参。 启用后(默认设置),仅会按基类比较形参化类型,因此允许进行 cast(list[object], int_list) 之类的转换。 禁用此选项还会报告只有其(不变)类型实参不同的转换。
使用忽略 TypedDict 结构(将 TypedDict 视为 dict)选项来控制是否将 TypedDict 视为普通字典。 启用后(默认设置),允许将 dict 转换为 TypedDict(或反向转换),因为 TypedDict 在运行时为 dict:
from typing import TypedDict, cast
class TD(TypedDict):
x: int
data: dict[str, object]
cast(TD, data) # ok
禁用此选项可在字典结构与 TypedDict 不匹配时报告此类转换。