你好
我在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类型
目前没有回答
相关问题 更多 >
编程相关推荐