在Python中,如何指定参数是所有元素都具有相同类型的列表?
快速提问 我正在尝试这样做: 输入导入列表中的在Python中,如何指定参数是所有元素都具有相同类型的列表?,python,python-3.x,typing,python-typing,Python,Python 3.x,Typing,Python Typing,快速提问 我正在尝试这样做: 输入导入列表中的 def反向列表(原始:列表)->列表: 返回原件[:-1] 如果传入这样的内容,我希望得到一个警告:[1,3,“a”,10],因为并非所有元素都具有相同的类型 我希望接受[“c”、“a”、“b”]或[1、8、2]——并让Python知道返回值将是字符串列表或整数列表 这可行吗?我感觉不是这样 谢谢 像这样试试。迭代列表中的每个元素,如果不是整数,则引发错误 from typing import List def reverse_list(ori
def反向列表(原始:列表)->列表:
返回原件[:-1]
如果传入这样的内容,我希望得到一个警告:[1,3,“a”,10]
,因为并非所有元素都具有相同的类型
我希望接受[“c”、“a”、“b”]
或[1、8、2]
——并让Python知道返回值将是字符串列表或整数列表
这可行吗?我感觉不是这样
谢谢 像这样试试。迭代列表中的每个元素,如果不是整数,则引发错误
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]
你需要自己做测试 输入导入列表中的
进口警告
def sameType(a、b):
返回类型(a)=类型(b)
def allSameType(列表):
allZip=zip(aList,aList[1:]
返回全部([allZip中a、b的sameType(a、b)])
def反向列表(原始:列表)->列表:
如果不是allSameType(原件):
warnings.warn('并非列表中的所有项目都是同一类型')
返回原件[:-1]
如果您认为继承的类与其祖先的类型相同,请将
type(a)==type(b)
更改为isinstance(a,b)
。这就是我的想法
def检查是否混合(列表:列表):
第一个类型=类型(列表[0])
为列表中的i返回any(非isinstance(i,第一个类型)
检查是否混合([1,2,3])
>>>假的
检查是否混合([1,2,“a”])
>>>真的
因此,如果您希望在存在混合类型的情况下收到警告,最简单的方法是在反转列表之前检查此项:
def reverse_列表(原始:列表)->列表:
如果检查混合(原件):
打印('警告:列表包含混合类型')
返回原件[:-1]
如果使用mypy之类的静态类型检查器检查程序,正确的做法是将函数设置为:
该TypeVar是一个“占位符”--类型检查器将理解,如果我们将列表[str]
传递到此函数中,T
必须是typestr
。因此,在完成替换后,它将得出结论,输出类型也必须是List[str]
请注意,这个解决方案比其他解决方案更有效,因为根本没有运行时检查——Python解释器完全忽略类型提示。静态类型检查器将验证程序的正确性
(这也是一个潜在的缺点——在类型检查开始成为防止bug的有效方法之前,您需要在程序的大部分中添加准确的类型提示,而这样做并不总是可行的。)看看这个网站是否能帮到您-谢谢Rafal,不是问题所问的!哈,这是真的:DThanks Matt,我认为这不可能,可能是一个不常见的用例。干杯谢谢Auss,这是一个性能更好的解决方案,非常感谢!但是你可以把
Union[str,int]
传递给它,对吗?然后,T
将是联合体,所以它不能满足我的需要。
from typing import List, TypeVar
T = TypeVar('T')
def reverse_list(original: List[T]) -> List[T]:
return original[::-1]