如何为可转换为dict的对象添加类型注解?
给可转换为dict的对象添加类型注解的推荐方案
1. 简洁通用的类型别名方案(兼容Python 3.8+)
Python的dict()构造函数支持两类核心输入:映射类型(如dict、OrderedDict),以及可迭代的键值对(每个元素是(哈希键, 值)的元组)。要覆盖具名元组、自定义类这类特殊场景,可以通过自定义类型别名简化注解:
import typing as typ # 定义可复用的类型别名 DictConvertible = typ.Union[ typ.Mapping[typ.Hashable, typ.Any], typ.Iterable[typ.Tuple[typ.Hashable, typ.Any]], typ.Any # 覆盖具名元组、自定义类等边缘场景 ] def foo(bar: DictConvertible) -> dict: return dict(bar)
如果不需要兼容极端边缘场景,可以去掉typ.Any,只保留前两类类型,注解会更精确。
2. Python 3.9+简化写法
Python 3.9开始支持直接用标准库类型写泛型,无需从typing导入,代码更简洁:
from collections.abc import Mapping, Iterable import typing as typ DictConvertible = typ.Union[ Mapping[typ.Hashable, typ.Any], Iterable[tuple[typ.Hashable, typ.Any]], typ.Any ] def foo(bar: DictConvertible) -> dict: return dict(bar)
3. 精确协议方案(Python 3.8+)
如果想更精准地定义“可转换为dict”的对象规范(比如类实现了__dict__属性,或__iter__返回键值对),可以用typing.Protocol:
import typing as typ from typing import Protocol class DictConvertible(Protocol): # 覆盖带__dict__属性的对象(如具名元组、普通自定义类) @property def __dict__(self) -> typ.Mapping[typ.Hashable, typ.Any]: ... # 覆盖可迭代键值对的对象 def __iter__(self) -> typ.Iterator[typ.Tuple[typ.Hashable, typ.Any]]: ... # 同时兼容映射类型和自定义协议类型 def foo(bar: typ.Union[typ.Mapping[typ.Hashable, typ.Any], DictConvertible]) -> dict: return dict(bar)
这个方案能明确标注符合转换要求的对象特征,避免过度依赖Any。
内容的提问来源于stack exchange,提问作者norok2
相关产品推荐
相关产品推荐

