Как указать, что объект python должен быть двух типов одновременно - PullRequest
0 голосов
/ 18 марта 2020

Я использую модуль ввода Python в своем проекте, и мне было интересно, есть ли способ указать, что данный объект должен быть двух разных типов одновременно. Это наиболее очевидно возникает, когда вы указали два протокола и ожидаете, что один объект будет выполнять оба:

class ReturnsNumbers(Protocol):
    def get_number(self) -> Int:
        pass

class ReturnsLetters(Protocol):
    def get_letter(self) -> str:
        pass

def get_number_and_letter(x: <what should this be?>) -> None:
    print(x.get_number(), x.get_letter())

Заранее спасибо!

Ответы [ 3 ]

3 голосов
/ 18 марта 2020

Создайте новый тип, который наследует от всех типов, которые вы хотите объединить sh, а также Protocol.

class ReturnsNumbersAndLetters(ReturnsNumbers, ReturnsLetters, Protocol):
    pass

def get_number_and_letter(x: ReturnsNumbersAndLetters) -> None:
    print(x.get_number(), x.get_letter())
3 голосов
/ 18 марта 2020

За этот комментарий по соответствующей проблеме вы можете сделать простой протокол пересечения:

class ReturnsNumbersAndLetters(ReturnsNumbers, ReturnsLetters, Protocol):
    pass

, а затем использовать его вместо:

def get_number_and_letter(x: ReturnsNumbersAndLetters) -> None:
    print(x.get_number(), x.get_letter())
1 голос
/ 18 марта 2020

Я бы сказал, что другие представленные решения имеют свои достоинства, за исключением того, что вам, возможно, придется иметь дело со случаем, когда у вас есть два отдельных объекта, которые оба реализуют оба класса. Если вы точно знаете, что объект, который вы хотите, наследует от ReturnsNumbers и ReturnsLetters, вы можете сделать это:

T = TypeVar(ReturnsNumbers, ReturnsLetters)

def get_number_and_letter(x: T) -> None:
    print(x.get_number(), x.get_letter())

Это позволяет избежать явного определения (возможно) бесполезного класса, гарантируя, что Вы получите нужную подсказку типа.

Вы можете найти соответствующую документацию здесь .

...