快速问题...
我正在尝试做这样的事情:
from typing import List
def reverse_list(original: List) -> List:
return original[::-1]
如果我输入类似[1, 3, "a", 10]
的内容,我想得到警告,因为并非所有元素都具有相同的类型。
我想接受["c", "a", "b"]
或[1, 8, 2]
-使Python知道返回值将是字符串列表或整数列表。
这可行吗?我感觉不是。
谢谢!
答案 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]