类型检查math.isclose()

时间:2019-10-09 06:59:13

标签: python python-3.x pycharm

基本上,我在声明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的影响?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

您的检查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)