You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeVar限定为str/bytes时,子类传入未触发mypy报错的疑问

TypeVar限定严格类型但子类未被mypy拦截的原因

先明确问题涉及的TypeVar定义和函数实现:

三种TypeVar定义

T = TypeVar('T')              # 可以是任意类型
S = TypeVar('S', bound=str)   # 可以是str的任意子类
A = TypeVar('A', str, bytes)  # 注释说明必须严格是str或bytes类型

拼接函数实现

def concatenate(x: A, y: A) -> A:
    """将两个字符串或bytes对象拼接在一起。"""
    return x + y

现象原因分析

  • mypy对显式枚举候选类型的TypeVar(比如TypeVar('A', str, bytes)这种写法)采用结构子类型检查,而非严格的名义子类型检查。简单来说,只要子类的结构(方法、属性、类型签名)和指定的候选类型兼容,mypy就会认为它符合约束,不会因为它是子类就报错。
  • 对于str的子类sstr,它默认继承了str的全部特性,包括__add__方法的签名。哪怕重写了__add__,只要新方法的输入输出类型和原str.__add__兼容,mypy依然会判定它满足A的类型要求。
  • 这种设计是为了适配Python的鸭子类型特性,保证代码灵活性——毕竟运行时str子类实例和str实例的行为几乎一致,mypy不会死板地只认str和bytes这两个名义类型。

内容的提问来源于stack exchange,提问作者Bychan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 02:53:19