错误:不兼容的返回值类型(得到“Tuple[Tuple[float, float], ...]”,预期为“List[Any]”)

问题描述 投票:0回答:1

背景

在尝试实现静态类型时,我在指定以下函数的返回类型时遇到一些困难:

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”)

问题

因此,我想问,对于(不确定的)长度的列表,是否建议指定列表中元素的类型(如果已知并且每个元素都相同),如果是,该怎么做那么?

python list python-typing mypy
1个回答
2
投票

我犯了多个小错误,导致了错误消息。一个可行的解决方案是:

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
  1. 正如 thinkgruen 在评论中所指出的,六边形对象是作为
    tuple
    而不是列表创建的。因此,无论我在方括号内放入什么内容,
    list[tuple..]
    都不会起作用。
  2. 我误读了错误行,我以为它是在 return 语句上抛出的。
  3. 我认为错误是关于
    -> List[..]
    和实际返回的对象之间的差异。
  4. 最初,我没有明确将所有
    tuple
    元素设为
    float
    类型,这意味着中间存在一些
    int
    类型。我没有注意到这一点。但是,我认为这就是错误建议类型
    any
    的原因。
  5. 通过将所有这些错误叠加在一起,在没有意识到这些错误的情况下,我认为我必须在列表中包含变量类型的显式长度,即使我找到的所有示例只显示了所有变量的单一类型列表中的元素。这个假设是无效的。
  6. 我尝试使用大写类型,正如我在一些示例中看到的那样。但这不是必需的。

总而言之,如果列表中的所有元素都具有相同类型,则可以编写

list[sometype]
,其中
sometype
是列表中每个元素的类型。我必须确保这些类型确实相同。

还有两件事我不清楚,那就是:

  1. 大写类型和非大写类型有什么区别。
  2. 是否可以在列表中指定一组可接受的类型,例如
    list[float,int]
    。回答,是的,您可以:
    List[Union[float,int]]

但是,这些是单独的问题。

© www.soinside.com 2019 - 2024. All rights reserved.