类型检查math.isclose()

问题描述 投票:1回答:2

基本上我在声明math.isclose(a_val, b_val)中的PyCharm中没有得到警告

Expected type 'SupportsFloat', got 'Number' instead

最小的,可复制的示例如下。

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来自其他地方,可能返回浮点数,整数或字符串。如果a_valb_val都是数字,我想检查一下它们是否几乎相等。否则,如果其中任何一个为字符串,则忽略它。

问题-将a_valb_val传递到math.isclose()之前,类型检查的最佳方法是什么?应该做些什么改变才能清除PyCharm造成的影响?

python python-3.x pycharm
2个回答
1
投票

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):
    ...

0
投票

您的检查isinstance(a_val, Number)的解决方案已结束。您只需要从Number模块将Real更改为numbersReal数字支持转换为浮点数,因此它是检查的正确类型。警告不见了。完整代码示例:

from numbers import Real
import math

a_val = '123'
b_val = 123.4

if isinstance(a_val, Real) and isinstance(b_val, Real):
    is_close = math.isclose(a_val, b_val, abs_tol=0.5)
© www.soinside.com 2019 - 2024. All rights reserved.