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
相关产品推荐
相关产品推荐

