如何为接收@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
相关产品推荐
相关产品推荐

