如何定义映射类型与对应类型参数可调用对象的字典类型?
如何定义键为类型、值为对应类型可调用对象的字典类型?
我需要在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
相关产品推荐
相关产品推荐

