根据类型,在列表上使用 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 则抛出异常)。
我创建了一个 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 则抛出异常)。