连接不同类型的列表

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

我有一个家长班

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 的情况下避免错误?

python python-3.x list mypy python-typing
1个回答
0
投票

使用 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]]

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