如何定义一个字典,将类型与接收该类型参数的可调用函数进行映射?

问题描述 投票:0回答:1

在 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?

python generics python-typing
1个回答
0
投票

没有办法做到这一点。没有任何注释可以表达各个字典键的类型及其对应值之间的关系。

你能得到的最接近的是定义一个包装器:

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]
。不过,这并不重要。)

© www.soinside.com 2019 - 2024. All rights reserved.