And*_*eas 5 python static-typing python-3.x mypy
我想知道是否提交给 Tuple[float, ...] 即使我知道元组的长度。
我有一个 Point 和一个 Rect 类,以及 Rect 类中的一个属性aspoints,该属性将作为两个元组返回左上角和右下角的元组。
迭代器有 type Iterator[float],我知道它会给我两个浮点数。我希望属性的返回值是,
Tuple[Tuple[float, float], Tuple[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)
Run Code Online (Sandbox Code Playgroud)
问题出现在 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
Run Code Online (Sandbox Code Playgroud)
您也可以将所有内容都放在一行中,但可读性会因此受到很大影响。该cast函数在运行时不执行任何操作,它只是作为一种显式方式告诉 mypy(或其他一些静态类型检查器)您对类型的了解比基本类型工具中可以表达的更多。
您绝对不应该将 的返回类型更改__iter__为非迭代器的任何类型,这会非常奇怪和令人困惑。
| 归档时间: |
|
| 查看次数: |
1908 次 |
| 最近记录: |