在尝试实现静态类型时,我在指定以下函数的返回类型时遇到一些困难:
def create_hexagon_coordinates(origin: tuple, unit: float, plot=False) -> list[Tuple[float,float]]:
unit = 3**0.5
mid_left = (float(-unit), 0.)
top_left = (float(-unit / 2), float(unit**2 / 2))
hexagon = (
mid_left,
top_left,
)
return hexagon
错误信息是:
错误:不兼容的返回值类型(得到“Tuple [Tuple [float,float],Tuple [float,float],Tuple [float,float],Tuple [float,float],Tuple [float,float],Tuple [float ,浮动]]”,预期为“列表[任何]”)
我认为通过在列表中包含元素类型的规范来比
List[Any]
更明确会更好。但是,如果我包含它,它还要求我指定列表的长度(因为它希望我指定所有元素的完整类型)。由于列表中的所有元素类型都会在错误消息中返回。
即使我将
List[Tuple[float,float]]
包含为大写,如 here 所示,错误也会变为:
错误:“List”不需要类型参数,但给出了 1 个
错误:不兼容的返回值类型(得到“Tuple [Tuple [float,float],Tuple [float,float],Tuple [float,float],Tuple [float,float],Tuple [float,float],Tuple [float ,浮动]]”,预期为“_ast.List”)
因此,我想问,对于(不确定的)长度的列表,是否建议指定列表中元素的类型(如果已知并且每个元素都相同),如果是,该怎么做那么?
我犯了多个小错误,导致了错误消息。一个可行的解决方案是:
def create_hexagon_coordinates(
origin: tuple, unit: float, plot=False
) -> list[tuple[float, float]]:
"""Creates a list of coordinates of a hexagon, with a horizontal line in
the top and bottom. Top right coordinate is named A, mid right coordinate
is named B, and clockwise onwards.
:param origin: tuple: Optional parameter to set the origin of the hexagon.
:param unit: float: Optional parameter to set the length of the standard
unit.
"""
if origin is None:
origin = (0, 0)
top_right: tuple[float, float] = (float(unit / 2), float(unit**2 / 2))
mid_right: tuple[float, float] = (float(unit), 0.0)
bottom_right: tuple[float, float] = (
float(unit / 2),
float(-(unit**2) / 2),
)
bottom_left: tuple[float, float] = (
float(-unit / 2),
float(-(unit**2) / 2),
)
mid_left: tuple[float, float] = (float(-unit), 0.0)
top_left: tuple[float, float] = (float(-unit / 2), float(unit**2 / 2))
hexagon: list[tuple[float, float]] = [
top_right,
mid_right,
bottom_right,
bottom_left,
mid_left,
top_left,
]
if plot:
figure(figsize=(8, 8), dpi=80)
plt.xlim(-5, 5)
plt.ylim(-5, 5)
for point in hexagon:
plt.scatter(point[0], point[1])
plt.show()
return hexagon
tuple
而不是列表创建的。因此,无论我在方括号内放入什么内容,list[tuple..]
都不会起作用。-> List[..]
和实际返回的对象之间的差异。tuple
元素设为 float
类型,这意味着中间存在一些 int
类型。我没有注意到这一点。但是,我认为这就是错误建议类型 any
的原因。总而言之,如果列表中的所有元素都具有相同类型,则可以编写
list[sometype]
,其中 sometype
是列表中每个元素的类型。我必须确保这些类型确实相同。
还有两件事我不清楚,那就是:
list[float,int]
。回答,是的,您可以:List[Union[float,int]]
。但是,这些是单独的问题。