根据python中键所描述的类型键入字典的值

2024-10-03 09:09:48 发布

您现在位置:Python中文网/ 问答频道 /正文

你好

我在Python中键入时遇到以下问题:

我想表示,字典中的值是值的列表。其中,列表中的值类型必须是键本身描述的类型

用例是,我希望根据元素的类存储元素列表,这样我就可以编写一个函数,根据类返回第一个元素

这就是我到目前为止的想法:

# ... imports ...

T = TypeVar("T", bound=SomeBaseClass)
ClassIndexedListDict = Dict[Type[T], List[T]]


class SubClassList:

    def __init__(self, *args: SomeBaseClass) -> None:
        self.__elementsByClass: ClassIndexedListDict = {}
        for elem in args:
            if type(elem) not in self.__elementsByClass:
                self.__elementsByClass[type(elem)] = []
            self.__elementsByClass[type(elem)].append(elem)

    def getFirst(self, cls: Type[T]) -> T:
        return self.__elementsByClass[cls][0]

class Usage:

    def __init__(self) -> None:
        self.__list = SubClassList(SubClassA(), SubClassB())  # SubClassA and SubClassB both extend SomeBaseClass
    
    def foo(self) -> int:
        self.__list.getFirst(SubClassA).methodInSubClassA()  # no linting error
        self.__list.getFirst(SubClassB).methodInSubClassA()  # linting error, as return value of self.__list.getFirst(SubClassB) must be of type SubClassB

但这让字典显然有任何价值

至少有一本像这样的字典

self.__elementsByClass = {
    int: ["test"]
}

使用mypy时似乎不会抛出任何错误

在此之前,我尝试将字典简单地键入Dict[Type[SomeBaseClass],List[SomeBaseClass]],但这与getFirst函数有问题,因为返回的类型必须匹配作为参数给出的类型,该类型可以是SomeBaseClass的子类

是否可以表达此约束,以便mypy在getFirst函数中注意到,键T处字典的所有元素都必须是T类型,因此返回值也必须是T类型


Tags: 函数self元素类型列表字典deftype