我有一个功能如下:
import numpy as np
def test() -> None:
a = map(np.radians, (1.,2.,np.array([1,2,3])))使用mypy计算此值将返回错误消息。
error: Argument 1 to "map" has incompatible type "ufunc"; expected "Callable[[object], Any]"只使用浮点数或只使用数组作为map的输入列表在这里没有问题,当输入列表/元组包含这两种类型的对象时,就会出现问题。在运行时,这也没有问题。如何修改此函数以满足mypy的要求并使其成为文件类型?
发布于 2021-12-18 17:39:24
这里的问题是,mypy推断(1., 2., np.array([1,2,3]))的元素类型为object (而不是您在这里希望的Union[float, np.ndarray] ),这与np.radians不兼容。
作为一种解决方法,您可以为tuple/list提供一个与tuple/list和np.radians的参数兼容的显式类型。例如:
from typing import Sequence, Union
import numpy as np
def test() -> None:
x: Sequence[Union[float, np.ndarray]] = (1., 2., np.array([1,2,3]))
a = map(np.radians, x)有一个开放的类型的github问题似乎类似,但可能不是完全相同的:python/mypy#6697。
发布于 2021-12-16 22:17:01
恕我直言,正确的解决方案是告诉MyPy忽略这一行。
import numpy as np
def test() -> None:
a = map(np.radians, (1.,2.,np.array([1.,2.,3.]))) # type: ignorePS:您总是有一个非常不可取的选项来编辑numpy库并修复_UFunc_Nin1_Nout1的调用签名以接受对象类型(除了ArrayLike)。下面的编辑会使您的类型错误信息消失。
--- a/typing/_ufunc.pyi
+++ b/typing/_ufunc.pyi
@@ -86,21 +86,21 @@ class _UFunc_Nin1_Nout1(ufunc, Generic[_NameType, _NTypes, _IDType]):
casting: _Casting = ...,
order: _OrderKACF = ...,
dtype: DTypeLike = ...,
subok: bool = ...,
signature: Union[str, _2Tuple[Optional[str]]] = ...,
extobj: List[Any] = ...,
) -> Any: ...
@overload
def __call__(
self,
- __x1: ArrayLike,
+ __x1: ArrayLike | object,
out: Union[None, NDArray[Any], Tuple[NDArray[Any]]] = ...,
*,
where: Optional[_ArrayLikeBool_co] = ...,
casting: _Casting = ...,
order: _OrderKACF = ...,
dtype: DTypeLike = ...,
subok: bool = ...,
signature: Union[str, _2Tuple[Optional[str]]] = ...,
extobj: List[Any] = ...,
) -> NDArray[Any] | Any: ...参考资料
type: ignore是PEP484的一部分是有原因的。_UFunc_Nin1_Nout,ufunc.pyi发布于 2021-12-20 16:23:26
我不知道这是不是故意的,但你没有在数组中使用点。
import numpy as np
def test() -> None:
a = map(np.radians, (1.,2.,np.array([1.,2.,3.])))https://stackoverflow.com/questions/70292790
复制相似问题