输入提示函数与 numpy 兼容问题

源代码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.meanMyPy 对复杂类型层次结构的要求过于严格。(可能是由于第一个参数的类型定义错误。) ((可能是 MyPy 的存根/类型定义中存在错误))

    代码运行,只是一个 linter 错误,很难说清谁的错。

    您有以下几种选择:

  • 1. 忽略对以下代码的 typecheckmean

    avg = np.mean(outputs) # type: ignore

    AList[T] 应该array_like,因为NumPy可以处理它。但由于某种原因,MyPy 有时无法使自定义类型等效。代码是正确的,因此您可以忽略该调用的类型。</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肉三

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值