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]
但我不明白为什么它不接受其他实现。
注意:我没有在文件的其他地方使用“元组”一词。即使文件中只有这些内容,也会发生此错误。
对于你的例子
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,则抛出异常)。
| 归档时间: |
|
| 查看次数: |
953 次 |
| 最近记录: |