gpt4 book ai didi

python - 在 Python 类型中声明元组的长度

转载 作者:太空宇宙 更新时间:2023-11-03 13:06:59 25 4
gpt4 key购买 nike

我想知道是否要提交给 Tuple[float, ...],即使我知道元组的长度。

我有一个 Point 和一个 Rect 类,以及 Rect 类中的一个属性 aspoints ,它以二元组的形式返回左上角和右下角的元组。

迭代器的类型为 Iterator[float],我知道它会给我两个 float 。我希望属性的返回值是元组[元组[float, float], 元组[float, float]]因为我知道迭代器会为每个点提供两个 float 。

我应该提交吗,只说它会返回一个Tuple[Tuple[float, ...], Tuple[float, ...]],在文档中留下评论它们的长度,还是有更好的解决方案?

这是代码。

from dataclasses import dataclass
from typing import Iterator, Tuple

@dataclass
class Point:
x: float
y: float

def __iter__(self) -> Iterator[float]:
return iter((self.x, self.y))

@dataclass
class Rect:
x: float
y: float
width: float
height: float

@property
def tl(self) -> Point:
return Point(self.x, self.y)

@property
def br(self) -> Point:
return Point(self.x + self.width, self.y + self.height)

@property
def aspoints(self) -> Tuple[Tuple[float, float], Tuple[float, float]]:
return tuple(self.tl), tuple(self.br)

问题出现在 Rect.aspoints 中。从 MyPy 我得到以下错误:

error: Incompatible return value type (got "Tuple[Tuple[float, ...], Tuple[float, ...]]", expected "Tuple[Tuple[float, float], Tuple[float, float]]")

最佳答案

您可以扩展您的 aspoints 函数以正确转换字段类型:

def aspoints(self) -> Tuple[Tuple[float, float], Tuple[float, float]]:
left = cast(Tuple[float, float], tuple(self.tl))
right = cast(Tuple[float, float], tuple(self.br))
return left, right

您也可以将所有内容都放在一行中,但可读性会受到很大影响。 cast函数在运行时不做任何事情,它只是作为一种明确的方式告诉 mypy(或其他一些静态类型检查器)你对你的类型的了解比基本类型工具所能表达的更多。

绝对不要__iter__ 的返回类型更改为任何不是迭代器的类型,那样会非常奇怪和令人困惑。

关于python - 在 Python 类型中声明元组的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55337632/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com