Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何指定python对象必须同时为两种类型_Python_Typing - Fatal编程技术网

如何指定python对象必须同时为两种类型

如何指定python对象必须同时为两种类型,python,typing,Python,Typing,我在整个项目中都在使用Python类型模块,我想知道是否有一种方法可以指定给定对象必须同时具有两种不同的类型。当您指定了两个协议,并期望一个对象同时满足这两个协议时,这一点最为明显: class ReturnsNumbers(Protocol): def get_number(self) -> Int: pass class ReturnsLetters(Protocol): def get_letter(self) -> str:

我在整个项目中都在使用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())
类返回成员(协议):
def get_编号(自身)->Int:
通过
类ReturnsLetters(协议):
def get_字母(自我)->str:
通过
def获取编号和字母(x:)->无:
打印(x.get_number(),x.get_letter())
提前谢谢

根据相关问题,您可以制定一个简单的交叉口协议:

class ReturnsNumbersAndLetters(ReturnsNumbers, ReturnsLetters, Protocol):
    pass
然后改用它:

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

创建从继承的新类型


我想说的是,除了您可能必须处理两个单独的对象都实现了这两个类的情况外,其他解决方案都有优点。如果您确实知道想要的对象同时继承自
ReturnsNumbers
ReturnsLetters
,则可以执行以下操作:

T = TypeVar(ReturnsNumbers, ReturnsLetters)

def get_number_and_letter(x: T) -> None:
    print(x.get_number(), x.get_letter())
这避免了(可能)无用类的显式定义,同时确保获得所需的类型暗示


您可以找到相关文档。

@Amadan已修复,并添加了指向相关政治公众人物的链接。我认为既然基类已经从
Protocol
继承了,就不必再这样做了,但是
Protocol
是特殊的。谢谢-这似乎是最好的方法。谢谢-这是一个整洁的方法,但在这种情况下,我并不认为对象将从这些类继承——目的只是确保它们实现方法。在这种情况下,您应该创建两个基类,其中包含这些方法,然后确保使用它们的任何对象都继承基类。顺便说一句,用Python进行接口是没有办法的,所以这可能是最接近的了。
T = TypeVar(ReturnsNumbers, ReturnsLetters)

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