使用python的输入库指定多个可能的类型

时间:2016-04-29 00:16:18

标签: python function data-structures typing

我想为函数指定类型提示,可以接收liststrlistint个。有没有办法用Python做到这一点?类似的东西:

from typing import List

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

    ...
    ...

2 个答案:

答案 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:您需要UnionList[List[T]]不会让您存储int列表和str列表,因为T可以' t在同一表达式中在strint之间切换。

但是,由于您在调用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]):
...