使用attrs的or_验证器时遇到mypy类型推断错误的解决咨询
使用attrs的or_验证器时遇到mypy类型推断错误的解决咨询
我尝试用attrs定义一个类,其中有一个属性可以是str或int类型。attrs.validators.or_验证器看起来正是我需要的,但按照文档里的模式修改后使用时,mypy却抛出了错误。
我的代码如下:
import attrs @attrs.define class C: val: int | str = attrs.field( validator=attrs.validators.or_( attrs.validators.instance_of(int), attrs.validators.instance_of(str), ) )
这段代码在运行时完全正常,符合预期,但mypy报出了这个错误:
error: Cannot infer type argument 1 of "or_" [misc]
有没有办法调整类型提示或者链式验证器,既能保证类型安全,又能让mypy满意呢?
这个问题本质是mypy无法自动推断or_验证器的类型参数,毕竟它需要明确知道验证器要接受的联合类型。这里有几个实用的解决办法:
方法一:显式指定or_的类型参数
直接给or_标注你需要的联合类型,让mypy能清晰识别:
import attrs @attrs.define class C: val: int | str = attrs.field( validator=attrs.validators.or_[int | str]( attrs.validators.instance_of(int), attrs.validators.instance_of(str), ) )
如果是Python 3.9及更早版本,替换成Union[int, str]即可(记得先从typing导入Union)。
方法二:用类型转换辅助推断
要是觉得上面的写法有点啰嗦,也可以用typing.cast告诉mypy这个验证器的类型:
import attrs from typing import cast, Callable @attrs.define class C: val: int | str = attrs.field( validator=cast(Callable[[object, attrs.Attribute, int | str], None], attrs.validators.or_( attrs.validators.instance_of(int), attrs.validators.instance_of(str), )) )
方法三:升级attrs到最新版本
部分旧版本的attrs和mypy的类型兼容性不足,升级到最新稳定版后,可能不需要修改代码就能自动解决这个推断问题。
这些方法都能在保留运行时验证逻辑的前提下,让mypy通过类型检查,同时维持类型安全。
备注:内容来源于stack exchange,提问作者I like Bananas
相关产品推荐
相关产品推荐

