vah*_*ndi 5 python function typing data-structures
我想指定类型提示的功能,可以接收无论是list的strS或A list的int秒.有没有办法用Python做到这一点?就像是:
from typing import List
def my_function(list_arg: List[str|int]):
...
...
Run Code Online (Sandbox Code Playgroud)
Union正是针对这种情况。它创建一个新类型,可以是您指定的任何类型:
from typing import Union, List
def my_function(list_arg: Union[List[str], List[int]]) -> None: ...
Run Code Online (Sandbox Code Playgroud)
如果您经常使用它,请创建一个类型别名:
MyList = Union[List[str], List[int]]
def my_function(list_arg: MyList) -> None: ...
Run Code Online (Sandbox Code Playgroud)
我不建议使用 @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)
Run Code Online (Sandbox Code Playgroud)
在此代码中,您别无选择:您需要Union(List[List[T]]不会让您同时存储 int 列表和 str 列表,因为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: ...
Run Code Online (Sandbox Code Playgroud)