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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 17:48:14