numpy 使用typehints区分坐标框架的方法

yftpprvb  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(83)

我正在开发一个python库来处理不同框架中的坐标。由于我有很多问题与混乱的框架,我想把更多的秩序到我的代码。
为此,我想将typehints分配给坐标并使用Mypy检查它们。我目前的做法是

from typing import NewType, cast
import numpy as np
import numpy.typing as npt

frameA = NewType('frameA', npt.NDArray)
frameB = NewType('frameB', npt.NDArray)

def f(x_A : frameA) -> frameB:
    # do something to get from frame A to frameB
    x_B = - x_A
    return cast(frameB, x_B)

# should work
x_A : frameA = np.random.rand(3,2)
x_B = f(x_A)

# should throw error
x_B : frameB = np.random.rand(3,2)
x_A = f(x_B)

实际上,Mypy能够检测f的输入是否在正确的坐标系中。然而,让我烦恼的是,定义x_A : frameA = np.random.rand(3,2)也抛出了一个错误,因为np.random.rand(3,2)的类型是ndarray[Any, dtype[floating[_64Bit]]],为了使它成为frameA,我必须强制转换它。
有没有更好的方法来实现这一点,而不需要在每次生成新变量时转换变量?F.E.,如果能有这样的东西就太好了

x_A : frameA = np.random.rand((3,2), type=frameA)
h7wcgrx3

h7wcgrx31#

frameA不仅仅是NDArray的别名;它是一个完全不同的类型,它的值是从NDArray类型的值创建的(尽管是微不足道的)。
你需要写

x_A : frameA = frameA(np.random.rand(3,2))

像任何其他类型的组合一样,Python不会简单地转换或以其他方式隐式地构造frame类型的值,因为它可以转换np.random.rand(3, 2)返回的值。

  • 在运行时,frameA实际上只是返回其参数的值,没有改变,因此从这个意义上说,frameANDArray值共享相同的运行时表示。

相关问题