如何指定一个python对象必须同时是两种类型

How to specify that a python object must be two types at once

我在整个项目中使用 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())

提前致谢!

根据 this comment 在相关问题上,您可以制定一个简单的交集协议:

class ReturnsNumbersAndLetters(ReturnsNumbers, ReturnsLetters, Protocol):
    pass

然后改用它:

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

创建一个继承自 all types you wish to combine, as well as Protocol 的新类型。

class ReturnsNumbersAndLetters(ReturnsNumbers, ReturnsLetters, Protocol):
    pass

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

我想说的是,除了您可能不得不处理两个单独的对象都实现了两个 classes 的情况之外,其他解决方案也有其优点。如果你确定你想要的对象继承自 ReturnsNumbersReturnsLetters,你可以这样做:

T = TypeVar(bound = ReturnsNumbers|ReturnsLetters)

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

这避免了(可能)无用的显式定义 class,同时确保您获得所需的类型提示。

您可以找到相关文档here