在Python中,如何指定参数是所有元素具有相同类型的列表?

时间:2019-05-14 09:37:01

标签: python python-3.x typing python-typing

快速问题...

我正在尝试做这样的事情:

from typing import List


def reverse_list(original: List) -> List:
    return original[::-1]

如果我输入类似[1, 3, "a", 10]的内容,我想得到警告,因为并非所有元素都具有相同的类型。

我想接受["c", "a", "b"][1, 8, 2]-使Python知道返回值将是字符串列表或整数列表。

这可行吗?我感觉不是。

谢谢!

4 个答案:

答案 0 :(得分:3)

这就是我想出的

def check_if_mix(list_: List):
    first_type = type(list_[0])
    return any(not isinstance(i, first_type) for i in list_)

check_mix([1,2,3])
>>>False

check_mix([1,2,"a"])
>>>True

因此,如果您希望在类型混合的情况下得到警告,最简单的方法是在反转列表之前进行检查:

def reverse_list(original: List) -> List:
    if check_mix(original):
        print('WARNING: list contains mixed types')
    return original[::-1]

答案 1 :(得分:1)

您需要自己进行测试

from typing import List
import warnings

def sameType(a, b):
 return type(a) == type(b)

def allSameType(aList):
 allZip = zip(aList, aList[1:])
 return all([sameType(a,b) for a,b in allZip])

def reverse_list(original: List) -> List:
    if not allSameType(original):
        warnings.warn('Not all the items in your list are the same type')
    return original[::-1]

如果您认为继承的类与其祖先的类型相同,请将type(a) == type(b)更改为isinstance(a, b)

答案 2 :(得分:0)

如果您正在使用像mypy这样的静态类型检查器来检查程序,则正确的做法是使函数成为generic function

from typing import List, TypeVar

T = TypeVar('T')

def reverse_list(original: List[T]) -> List[T]:
    return original[::-1]

TypeVar是一个“占位符”-类型检查器将理解,如果我们将List[str]传递给此函数,则T必须为str类型。因此,它将得出结论,在完成替换后,输出类型也必须为List[str]

请注意,此解决方案比其他解决方案更为有效,因为根本没有运行时检查发生-Python解释器完全忽略了类型提示。静态类型检查器将改为验证程序的正确性。

(这也可能是不利的一面-您需要在程序的大部分内容中添加准确的类型提示,然后类型检查才开始成为预防错误的有效方法,并且这样做并不总是可行的。 )

答案 3 :(得分:-1)

尝试这样。遍历列表中的每个元素,如果不是整数则引发错误。

from typing import List

def reverse_list(original: List) -> List:
    for element in original:
        if not isinstance(element, int):
            raise TypeError("Element of the list: " + element + " is not an integer.")
    return original[::-1]