Python 避免在相互引用中从另一个类重新定义一个类时 mypy 失败

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

考虑一对在 Python 中表示相同事物的类,并且每个类都实现一个将一个类转换为另一个类的方法。作为一个例子,考虑从笛卡尔坐标转换为极坐标,反之亦然。

@dataclass
class CartesianCoordinates:
  x: float
  y: float
  
  def toPolarCoordinates(self) -> PolarCoordinates:
      radius = ...
      theta = ...
      result = PolarCoordinates(radius, theta)
      return result
  

@dataclass
class PolarCoordinates:
  radius: float
  theta: float

  def toCartesianCoordinates(self) -> CartesianCoordinates:
    x = ...
    y = ...
    result = CartesianCoordinates(x,y)
    return result

由于我在定义之前使用

PolarCoordinates
,因此我尝试通过在
CartesianCoordinates
定义之前插入以下行来转发(实际上是重新定义)其声明:

class PolarCoordinates:
    # forwarding declaration
    pass

这是有效的,因为代码运行正确,但由于类重新定义,像 mypy 这样的检查将失败,并出现类似

Name PolarCoordinates already defined
的错误。

我知道Python中真正的前向声明是不可能的,但是有什么等价的东西可以允许在完全定义之前引用一个类,并且允许像mypy这样的python检查通过吗?

python mypy forward-declaration python-dataclasses
1个回答
0
投票

Python 支持前向类型声明。您可以使用字符串:

    def toPolarCoordinates(self) -> “PolarCoordinates”:

或从未来导入(无需 DeLorean):

from __future__ import annotations

…

    def toPolarCoordinates(self) -> PolarCoordinates:
© www.soinside.com 2019 - 2024. All rights reserved.