我想为函数指定类型提示,可以接收list
个str
或list
个int
个。有没有办法用Python做到这一点?类似的东西:
from typing import List
def my_function(list_arg: List[str|int]):
...
...
答案 0 :(得分:2)
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列表和str列表,因为T
可以' t在同一表达式中在str
和int
之间切换。
但是,由于您在调用Union
的代码中使用my_function
,因此您还必须在Union
签名中使用my_function
。
此外,泛型会增加类型的复杂性,在某些时候,您将遇到类型系统的限制。因此,最好在您确实需要它们的情况下保留泛型,例如,如果您希望返回类型my_function
依赖于参数类型:
T = TypeVar("T", int, str)
# this can't be achieved with Union:
def my_function(list_arg: List[T]) -> T: ...
答案 1 :(得分:-1)
from typing import TypeVar, List
T = TypeVar("T", int, str)
def my_function(list_arg: List[T]):
...