使用python的打字库来指定多个可能的类型
我想指定一个函数的类型提示可以接收list
的str
s或list
的int
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:你需要一个Union
(List[List[T]]
不会让你同时存储一个int和列表的列表因为T
无法在str
和int
之间切换为相同的表达式)。
但由于您在调用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: ...
from typing import TypeVar, List
T = TypeVar("T", int, str)
def my_function(list_arg: List[T]):
...
这实际上是正确的,但前提是需要一个泛型函数,这个问题并不明显。例如,如果要在'my_function'中的变量类型或'my_function'的返回类型中使用'T'。 – max
我想这是比较完整的,所以我将其标记为对其他人正确,但是谢谢@ user6269244 - 它在以前为我解决了问题! – vahndi