如何为Python函数参数推导MyModel.items()的返回类型提示?
如何复用MyModel.items()的返回类型作为类型提示?
问题描述
我定义了常用类型MyModel = dict[str, int],在部分场景中需要处理MyModel.items()返回的键值元组流,但目前每次都要重复编写t.Iterable[tuple[str, int]]这类类型提示,希望能通过自动关联MyModel的方式替代重复代码,示例代码如下:
import typing as t MyModel = dict[str, int] def print_mappings(stream: t.Iterable[tuple[str, int]]) -> None: ... if __name__ == "__main__": my_model = {str(n): n for n in range(10)} print_mappings(my_model.items())
解决方案
1. 利用Python 3.10+的KeyOf和ValueOf自动推导
Python 3.10及以上版本支持typing.KeyOf和typing.ValueOf,可以直接从MyModel中提取键和值的类型,无需手动重复写str和int:
import typing as t MyModel = dict[str, int] def print_mappings(stream: t.Iterable[tuple[t.KeyOf[MyModel], t.ValueOf[MyModel]]]) -> None: ...
2. 定义类型别名直接关联ItemsView
dict.items()返回的是ItemsView类型,它本身就是Iterable[tuple[K, V]]的子类,你可以直接基于MyModel定义对应的类型别名:
import typing as t MyModel = dict[str, int] # 直接复用MyModel的键值类型定义 MyModelItems = t.ItemsView[str, int] def print_mappings(stream: MyModelItems) -> None: ...
如果想让别名更通用(兼容任何可迭代的键值元组流),也可以结合KeyOf/ValueOf:
MyModelItemStream = t.Iterable[tuple[t.KeyOf[MyModel], t.ValueOf[MyModel]]] def print_mappings(stream: MyModelItemStream) -> None: ...
3. 泛型绑定实现动态同步(适合需频繁修改MyModel的场景)
如果后续可能修改MyModel的键值类型,用泛型绑定可以让类型提示自动同步,无需手动修改:
import typing as t from typing import TypeVar, Generic K = TypeVar('K') V = TypeVar('V') # 基于泛型定义MyModel模板 class MyModel(Generic[K, V], dict[K, V]): pass # 实例化具体的MyModel类型 MyConcreteModel = MyModel[str, int] # 定义对应的items返回类型 MyModelItems = t.ItemsView[K, V] def print_mappings(stream: MyModelItems[str, int]) -> None: ... # 使用示例 my_model = MyConcreteModel({str(n): n for n in range(10)}) print_mappings(my_model.items())
注意事项
KeyOf和ValueOf仅在Python 3.10及以上版本可用;ItemsView完全兼容dict.items()的返回值,直接用它作为类型提示不会有兼容性问题;- 当
MyModel的类型定义变更时,使用KeyOf/ValueOf或泛型的方案会自动同步类型提示,减少重复修改的工作量。
内容的提问来源于stack exchange,提问作者Max Görner
相关产品推荐
相关产品推荐

