源代码example.py
:
from typing import Union, Any
import numpy as np
Number = Union[int, float, np.floating[Any]]
def add_one(num: Number) -> Number:
return num + 1
inputs = [1, 2, 3]
outputs = [add_one(n) for n in inputs]
avg = np.mean(outputs)
运行 mypy example.py:
mypy example.py
src/example.py:14: error: Argument 1 to "mean" has incompatible type "List[Union[float, floating[Any]]]"; expected "Union[_SupportsArray[dtype[Any]], _NestedSequence[_SupportsArray[dtype[Any]]], bool, int, float, complex, str, bytes, _NestedSequence[Union[bool, int, float, complex, str, bytes]]]"
Found 1 error in 1 file (checked 1 source file)
我可以将所有内容更改为np.floating[Any]
修复 numpy 问题,但随后我必须将原语转换为np.float32(...)
:
from typing import Any
import numpy as np
def add_one(num: np.floating[Any]) -> np.floating[Any]:
return num + 1
inputs = [1, 2, 3]
outputs = [add_one(np.float32(n)) for n in inputs]
avg = np.mean(outputs)
是否有正确的方法来键入提示add_one
函数,以便其输出与 numpy 函数兼容,而np.mean
不会破坏与 python 原始类型的兼容性?最终目标是能够像这样使用它:
inputs = [1, 2, 3]
outputs = [add_one(n) for n in inputs]
avg = np.mean(outputs)
- 解决方法:
-
numpy.mean
MyPy 对复杂类型层次结构的要求过于严格。(可能是由于第一个参数的类型定义错误。) ((可能是 MyPy 的存根/类型定义中存在错误))代码运行,只是一个 linter 错误,很难说清谁的错。
您有以下几种选择:
-
1. 忽略对以下代码的 typecheck
mean
avg = np.mean(outputs) # type: ignore
A
List[T]
应该是array_like
,因为NumPy
可以处理它。但由于某种原因,MyPy
有时无法使自定义类型等效。代码是正确的,因此您可以忽略该调用的类型。</