Как выразить множественное наследование в подсказке типа Python?
В Java C# универсальный метод может иметь параметр типа с ограничением для определения интерфейсов, которые должны быть реализованы.
static <T extends Iterable<Integer> & Comparable<Integer>> void test(T p) {
}
В Python, если я хочу использовать подсказку типа, чтобы указать, что переменная должна наследовать классы A и B, как я могу это сделать? Я проверил модуль ввода, он имеет только Union, что означает, что тип переменной может быть любой подсказкой, а не всей подсказкой.
Создание нового класса C, который наследует A и B, кажется решением, но выглядит громоздким.
Заранее спасибо.
1 ответ
Определение этого класса эквивалентно:
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]
...
Универсальные метаклассы не поддерживаются.
Технически вы можете напечатать var: Class1 and Class2
а также var: (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 не может разрешить эти конструкции должным образом: https://i.s tack.imgur.com/LLvbR.png