Использование подсказок типа для обозначения подкласса нескольких классов, например `typing.Intersection`?Python

Программы на Python
Anonymous
Использование подсказок типа для обозначения подкласса нескольких классов, например `typing.Intersection`?

Сообщение Anonymous »

Я ищу, но не могу найти краткий способ обозначения подсказки типа obj: «подкласс A и B». Подсказка типа obj: typing.Union[A, B] не охватывает этот случай, поскольку она принимает экземпляр A или B или любого из их подклассов.Я пишу протокол, который может быть реализован классами.
Этот интерфейс имеет метод __eq__, который может сравнивать несколько экземпляров одного и того же класса, реализующего этот протокол. Реализуя этот протокол, классы получают реализацию метода __eq__ по умолчанию.

Код: Выделить всё

import typing

@typing.runtime_checkable
class MyInterface(typing.Protocol):

def __eq__(o1, o2) -> bool:
''' checks if `o1` and `o2` are equal to one another '''
from random import randint
return bool(randint(0,1)) # TODO: write a better implementation

...
Я хочу добавить подсказки типов, чтобы обозначить, что 1. оба объекта __eq__ должны быть экземплярами одного и того же класса и 2. должны реализовывать MyProtocol .
Вот что я рассмотрел:
  • Можно определить переменную типа следующим образом: T = typing.TypeVar('T') и используйте это в подписи:

Код: Выделить всё

def __eq__(o1: T, o2: T) -> bool:
Однако это не требует реализации MyProtocol.
  • Вместо этого я мог бы подробно рассказать о протоколе :

Код: Выделить всё

def __eq__(o1: 'MyProtocol', o2: 'MyProtocol') -> bool:
Однако это не мешает статическим типам представлять собой две разные иерархии классов без общей структуры, которые оба реализуют протокол (например, BankAccount реализует HasOpen и Door реализует HasOpen).
Как можно этого добиться?

Подробнее здесь: https://stackoverflow.com/questions/718 ... intersecti

Вернуться в «Python»