我有一个家长班
A
。它有几个孩子:班级A1
,A2
等。
我想创建一个可以包含任何子级的列表或包含任何子级的列表,并将其解释为类B
。代码:
#!/usr/bin/python3
from typing import Union, List, NewType, Type, Sequence
from dataclasses import dataclass
class A:
pass
class A1(A):
pass
class A2(A):
pass
B = NewType("B", Sequence[Union[Sequence[Type[A]], Type[A]]])
b1 = B([A1] + [A2]*2 + [[A1, A2]])
b2 = B([A1, A2, [A1, A2]])
如果我手动创建列表,则效果很好。但如果我通过连接不同的列表来创建它,MyPy linter 会报告错误:
main.py:17: error: List item 0 has incompatible type "Type[A2]"; expected "Type[A1]"
main.py:17: error: List item 0 has incompatible type "List[Type[A]]"; expected "Type[A1]"
有没有办法在不抑制 MyPy linter 的情况下避免错误?
使用 TypeVar 来处理类型层次结构。 更明确地指定列表项的类型。
输入 import Union、List、TypeVar、Type、Sequence from 数据类导入数据类
class A: pass class A1(A): pass class A2(A): pass T = TypeVar('T', bound=A) B = List[Union[Type[T], List[Type[T]]]] b1: B[A] = [A1, A2, A2, [A1, A2]] b2: B[A] = [A1, A2, [A1, A2]]