报告源类型和目标类型不相关的 typing.cast 调用。

当源类型既不是目标类型的子类型,目标类型也不是源类型的子类型时,将报告错误。 此类转换通常指示逻辑错误,因为一种类型的实例不能被假定为另一种类型的实例,并且 typing.cast 不会动态验证类型。

此检查甚至适用于理论上可能具有共同后代的类型。 例如,它将标记两个同级类 LeftRight 之间的转换,因为它们都继承自 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 不匹配时报告此类转换。