在 Python 中,我在定义类型时遇到困难。我想要这样的东西:
def foo(x: int) -> int:
return x
def bar(x: str) -> str:
return x
# [...] MyDictType would be defined here...
my_dict: MyDictType = {
int: foo, # Good
str: bar, # Good
float: bar # WRONG! Type warning!
}
MyDictType 应该指示它是一个字典,将类型与接收该类型变量的可调用函数进行映射。我想知道如何使用泛型来做到这一点......但我不确定。我试过这个:
T = TypeVar("T")
MyDictType = dict[Type[T], Callable[[T], T]]
但是,编辑器并没有在字典的第三个条目中显示我所期望的错误......
我应该如何定义MyDictType?
没有办法做到这一点。没有任何注释可以表达各个字典键的类型及其对应值之间的关系。
你能得到的最接近的是定义一个包装器:
from collections.abc import Callable
from typing import Any, TypeVar
T = TypeVar('T')
class TypeMapperThing:
_mapping: dict[type, Callable[[Any], Any]]
def __init__(self):
self._mapping = {}
def __getitem__(self, key: type[T]) -> Callable[[T], T]:
return self._mapping[key]
def __setitem__(self, key: type[T], value: Callable[[T], T]):
self._mapping[key] = value
这里,包装器隐藏了
Any
的使用,并提供了类型安全的外部 API。 (我可以省略 Callable
上的类型参数,只写 _mapping: dict[type, Callable]
,但这会使用 Callable[..., Any]
而不是 Callable[[Any], Any]
。不过,这并不重要。)