在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
必须是type
str
。因此,在完成替换后,它将得出结论,输出类型也必须是
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]