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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 03:57:31