![](/img/trans.png)
[英]Why does typing variable length Tuple require ellipses but List does not?
[英]using tuple() on a list does not return an identical tuple according to typing
我创建了一个 class ,其列表属性包含一个 int 和一个 float。 然后我尝试创建一个 getter 方法以将列表作为元组返回。
from typing import Tuple, List
class MyClass:
def __init__(self):
self.__lst = [3, 5.0]
def get_lst_as_tup(self) -> Tuple[int, float]:
return tuple(self.__lst)
虽然它似乎工作正常,但 PyCharm 出现了一个问题:
Expected type 'Tuple[int, float]', got 'Tuple[Union[int, float], ...]' instead
在寻求堆栈溢出后,我为 return 语句尝试了其他几种实现。 这导致了同样的错误:
return (element for element in self.__lst)
return tuple(element for element in self.__lst)
return (*self.__lst,)
这个特定的实现导致:
Expected type 'Tuple[int, float]', got 'Tuple[Any]' instead
我能够通过使用return self.__lst[0], self.__lst[1]
摆脱错误
但我不明白为什么它不接受其他实现。
注意:我没有在文件的其他地方使用元组这个词。 即使文件中只有这些,也会发生此错误。
对于你的例子
return (element for element in self.__lst)
我怀疑您是否遇到与 this 实际上返回生成器而不是元组相同的错误。
你的其他尝试
return tuple(self.__lst)
return (*self.__lst,)
return tuple(element for element in self.__lst)
都是将列表self.__lst
转换为元组的有效方法。 当然,最易读的是tuple(self.__lst)
,所以你应该坚持这个。
我认为这里建议的类型Tuple[Union[int, float], ...]
仍然太窄。 您正在将可变长度的列表转换为元组。 无法知道self.__lst
在您的程序中的长度。 考虑一下:
m = MyClass()
m._MyClass__lst.append("hello")
r = m.get_lst_as_tup()
print(r)
Output: (3, 5.0, 'hello')
这是Tuple[int, float, str]
类型。
但是,当您使用return self.__lst[0], self.__lst[1]
时,可以保证 function 将返回长度为 2 的元组(如果列表小于长度 2,则抛出异常)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.