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

如何为接收@define装饰类实例的Python函数添加类型注解?

attrs类实例的类型注解解决方案

针对你遇到的@define装饰类实例的类型注解问题,以下是几种可行的解决方案:

方案1:使用官方提供的attrs.AttrsInstance

从attrs 21.3.0版本开始,官方提供了AttrsInstance这个Protocol类型,可直接用于类型注解。如果代码检查工具不认可,需确保两点:

  • 你的attrs版本≥21.3.0,可通过pip install --upgrade attrs升级
  • 配置代码检查工具识别attrs的类型提示:
    • 对于mypy:无需额外安装,attrs自带类型定义,确保mypy版本≥0.910
    • 对于pylint:安装pylint-attrs插件(pip install pylint-attrs),并在配置中启用

示例代码:

from attrs import asdict, define, AttrsInstance
import json

def asjson(attrs_instance: AttrsInstance) -> str:
    return json.dumps(asdict(attrs_instance))

方案2:自定义Protocol检测__attrs_attrs__属性

如果无法升级attrs版本,或者linter仍不识别AttrsInstance,可以自己定义一个Protocol,利用所有@define装饰的类都会生成的__attrs_attrs__属性来做类型检测:

from typing import Protocol, Iterable
from attrs import asdict, define
import json

class AttrsClass(Protocol):
    __attrs_attrs__: Iterable[object]

def asjson(attrs_instance: AttrsClass) -> str:
    return json.dumps(asdict(attrs_instance))

这个Protocol会匹配所有带有__attrs_attrs__属性的对象,正好对应所有@define装饰的类实例,代码检查工具会完全认可这种写法。

方案3:使用TypeVar绑定限定类型

如果你需要更灵活的泛型支持,可以用TypeVar结合bound参数,限定类型必须符合自定义的Protocol:

from typing import Protocol, Iterable, TypeVar
from attrs import asdict, define
import json

class AttrsClass(Protocol):
    __attrs_attrs__: Iterable[object]

T = TypeVar("T", bound=AttrsClass)

def asjson(attrs_instance: T) -> str:
    return json.dumps(asdict(attrs_instance))

这种方式适合需要在函数中保留原始类型信息的场景。

内容的提问来源于stack exchange,提问作者Wör Du Schnaffzig

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 13:03:13