python - math.isclose() 的类型检查

标签 python python-3.x pycharm

基本上,我在 PyCharm 中的语句 math.isclose(a_val, b_val)

中得到以下警告

预期类型为“SupportsFloat”,得到的是“Number”

最小的、可重现的例子如下。

from numbers import Number
import math

a_val = '123'
b_val = 123.4

if isinstance(a_val, Number) and isinstance(b_val, Number):
    is_close = math.isclose(a_val, b_val, abs_tol=0.5)

实际上,a_valb_val 来自其他地方,可以返回 float 、整数或字符串。如果 a_valb_val 都是数字,我想检查它们是否几乎相等。否则,如果其中任何一个是字符串,就忽略它。

问题 - 在将 a_valb_val 传递给 math.isclose() 之前进行类型检查的最佳方法是什么?清除 PyCharm wanring 应该做哪些更改?

最佳答案

math.isclose 不支持任意Number 实例。与大多数 math 函数一样,math.isclose 需要可以转换为 float 的参数。 Number 可能类似于 1+2j,它不能转换为 float。 (此外,str 不算数 - 它必须是带有 __float__ 方法的东西。)

我本来打算建议使用 typing.SupportsFloat,但看起来我误读了代码,typing.SupportsFloat 不支持 isinstance检查。如果您的唯一选项是 strfloatint,那么最简单的方法可能是只检查 floatint,或者换一种方式拒绝 str:

if isinstance(a_val, (float, int)) and isinstance(b_val, (float, int)):
    ...

if not isinstance(a_val, str) and not isinstance(b_val, str):
    ...

关于python - math.isclose() 的类型检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58298650/

相关文章:

python-3.x - Python-Docx 缺少默认模板

适用于 Maya 的 Python : Why can't I use a variable in concatination with a wildcard?

python - from ... import ... 语句的对齐

python - 无法在 Pycharm 中安装 pygame

python - 更好的 python 逻辑可以防止在嵌套循环中比较数组时超时

python - 使用递归查找列表中第二小的数字

python - 库未在 Python (pygame) 中初始化

python - 如何在 python Flask 中为日志文件创建配置文件

text - python : how to add text inside a canvas?

python - 如何使用python命令执行python脚本