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

ere*_*bel 3 python tuples typing typechecking

我创建了一个具有包含 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)
Run Code Online (Sandbox Code Playgroud)

虽然 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]

但我不明白为什么它不接受其他实现。

注意:我没有在文件的其他地方使用“元组”一词。即使文件中只有这些内容,也会发生此错误。

Lyd*_*yke 5

对于你的例子

return (element for element in self.__lst)
Run Code Online (Sandbox Code Playgroud)

我怀疑您是否遇到了相同的错误,因为这实际上返回了一个生成器而不是一个元组。

你的其他尝试

return tuple(self.__lst)
return (*self.__lst,)
return tuple(element for element in self.__lst)
Run Code Online (Sandbox Code Playgroud)

都是将列表转换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)
Run Code Online (Sandbox Code Playgroud)

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

这是类型Tuple[int, float, str]。

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