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

using tuple() on a list does not return an identical tuple according to typing

我创建了一个 class,其列表属性包含一个 int 和一个 float。 然后我尝试创建一个 getter 方法来 return 列表作为元组。

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)

我怀疑您得到的错误与此相同,实际上 return 是一个生成器,不是 一个元组。

你的其他尝试

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)

输出: (3, 5.0, 'hello')

类型为 Tuple[int, float, str]

但是,当您使用 return self.__lst[0], self.__lst[1] 时,可以保证该函数将 return 一个长度为 2 的元组(或者如果列表小于长度 2 则抛出异常)。