使用python的打字库来指定多个可能的类型

问题描述:

我想指定一个函数的类型提示可以接收liststr s或listint s。有没有办法使用Python来做到这一点?喜欢的东西:使用python的打字库来指定多个可能的类型

from typing import List 

def my_function(list_arg: List[str|int]): 

    ... 
    ... 

Union正是适用于这种情况。它创建了一个新的类型,可以是任何类型的指定:

from typing import Union, List 
def my_function(list_arg: Union[List[str], List[int]]) -> None: ... 

如果你经常使用它,做一个类型别名:

MyList = Union[List[str], List[int]] 
def my_function(list_arg: MyList) -> None: ... 

我不会建议使用一个通用的功能@ user6269244答案暗示,除非您因为某些特定原因需要它。虽然T = TypeVar('T', int, str)将在一个简单的情况下工作,但会更具限制性。

例如,假设你有这样的事情:

def apply_my_function(list_of_lists: List[MyList]) -> None: 
    # each item in list_of_lists is either a List[int] or List[str] 
    for arg in list_of_lists: 
    my_function(arg) 

在这段代码中,你有没有chioce:你需要一个UnionList[List[T]]不会让你同时存储一个int和列表的列表因为T无法在strint之间切换为相同的表达式)。

但由于您在调用my_function的代码中使用Union,因此您还必须在my_function本身的签名中使用Union

此外,泛型会增加类型的复杂性,并且在某些时候您会遇到类型系统的局限性。所以,最好是保留仿制药的情况下,你真的需要它们,例如,如果你想要的my_function返回类型取决于参数类型:

T = TypeVar("T", int, str) 

# this can't be achieved with Union: 
def my_function(list_arg: List[T]) -> T: ... 
+0

我想这是比较完整的,所以我将其标记为对其他人正确,但是谢谢@ user6269244 - 它在以前为我解决了问题! – vahndi

from typing import TypeVar, List 

T = TypeVar("T", int, str) 

def my_function(list_arg: List[T]): 
... 
+0

这实际上是正确的,但前提是需要一个泛型函数,这个问题并不明显。例如,如果要在'my_function'中的变量类型或'my_function'的返回类型中使用'T'。 – max