繁体   English   中英

根据类型在列表上使用 tuple() 不会返回相同的元组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM