我正在开发一个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)
1条答案
按热度按时间h7wcgrx31#
frameA
不仅仅是NDArray
的别名;它是一个完全不同的类型,它的值是从NDArray
类型的值创建的(尽管是微不足道的)。你需要写
像任何其他类型的组合一样,Python不会简单地转换或以其他方式隐式地构造
frame
类型的值,因为它可以转换np.random.rand(3, 2)
返回的值。frameA
实际上只是返回其参数的值,没有改变,因此从这个意义上说,frameA
和NDArray
值共享相同的运行时表示。