如何在Python类型提示中表达多重继承?

时间:2018-10-11 07:14:02

标签: python python-typing

在Java C#中,泛型方法可以具有带有约束的类型参数来定义必须实现的接口。

static <T extends Iterable<Integer> & Comparable<Integer>> void test(T p) {

}

在Python中,如果我想使用类型提示来指定变量必须继承类A和B,我该怎么做?我检查了键入模块,它只有一个Union,这意味着变量的类型可以是任何提示,而不能是所有提示。

创建一个继承A和B的新类C似乎是一种解决方案,但看起来很麻烦。

2 个答案:

答案 0 :(得分:2)

该类定义等同于:

class MyIter(Iterator[T], Generic[T]):
    ...

您可以对Generic使用多重继承:

from typing import TypeVar, Generic, Sized, Iterable, Container, Tuple

T = TypeVar('T')

class LinkedList(Sized, Generic[T]):
    ...

K = TypeVar('K')
V = TypeVar('V')

class MyMapping(Iterable[Tuple[K, V]],
                Container[Tuple[K, V]],
                Generic[K, V]):
    ...

在不指定类型参数的情况下对通用类进行子类化时,假定每个位置都为Any。在下面的示例中,MyIterable不是通用的,而是隐式继承自Iterable [Any]:

from typing import Iterable

class MyIterable(Iterable):  # Same as Iterable[Any]
    ...

不支持通用元类。

答案 1 :(得分:0)

从技术上讲,您可以键入var: Class1 and Class2var: (Class1, Class2),但是类型检查器将无法正确解析它。 这段代码可以在Python 3.6上正常工作

class A:
    pass
class B:
    pass

def func_1(a: A, b: B, both: A and B):
    pass
def func_2(a: A, b: B, both: (A, B)):
    pass

这将导致:

func_1.__annotations__
{'a': <class '__main__.A'>, 'b': <class '__main__.B'>, 'both': <class '__main__.B'>}
func_2.__annotations__
{'a': <class '__main__.A'>, 'b': <class '__main__.B'>, 'both': (<class '__main__.A'>, <class '__main__.B'>)}

我的PyCharm 2018.3的类型检查器无法正确解析以下构造: PyCharm 2018.3 Type Checker