Как выразить множественное наследование в подсказке типа 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

Другие вопросы по тегам