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

如何定义映射类型与对应类型参数可调用对象的字典类型?

如何定义键为类型、值为对应类型可调用对象的字典类型?

我需要在Python中定义一种特定的字典类型,要求字典的键是某个类型,对应的值是接收该类型参数并返回同类型结果的可调用对象。示例代码如下:

def foo(x: int) -> int:
    return x
    
def bar(x: str) -> str:
    return x

# [...] 在此处定义MyDictType...
        
my_dict: MyDictType = {
    int: foo,       # 符合要求
    str: bar,       # 符合要求
    float: bar      # 错误!应触发类型警告!
}

我尝试用泛型实现,但没有得到预期的类型警告:

T = TypeVar("T")

MyDictType = dict[Type[T], Callable[[T], T]]

请问该如何正确定义MyDictType?


你之前的定义问题在于,dict[Type[T], Callable[[T], T]]表示整个字典的所有键值对都对应同一个类型变量T,类型检查器会把T推断为int | str | float,从而认为bar(Callable[[str], str])可以适配这个联合类型,因此不会触发警告。

要实现每个键值对独立匹配「类型→对应可调用对象」的约束,需要用**协议(Protocol)**来定义字典的行为:

from typing import Protocol, TypeVar, Type, Callable

T = TypeVar("T")

class MyDictType(Protocol):
    def __getitem__(self, key: Type[T]) -> Callable[[T], T]: ...

这样定义后,类型检查器会验证字典中的每个键值对:当键是float类型时,对应的值必须是Callable[[float], float],而bar的签名是Callable[[str], str],不满足要求,就会触发预期的类型警告。

另外,如果你使用Python 3.11及以上版本,也可以用更简洁的泛型语法,但对于任意类型作为键的场景,Protocol是更通用的解决方案。

内容的提问来源于stack exchange,提问作者asmartin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 15:40:25