基本上我在声明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_val
和b_val
来自其他地方,可能返回浮点数,整数或字符串。如果a_val
和b_val
都是数字,我想检查一下它们是否几乎相等。否则,如果其中任何一个为字符串,则忽略它。
问题-将a_val
和b_val
传递到math.isclose()
之前,类型检查的最佳方法是什么?应该做些什么改变才能清除PyCharm造成的影响?
math.isclose
不支持任意Number
实例。像大多数math
函数一样,math.isclose
需要可转换为float
的参数。 Number
可能类似于1+2j
,无法转换为float
。 (此外,str
不计数-它必须使用__float__
方法。)
我本来建议使用typing.SupportsFloat
,但似乎我误读了代码,并且typing.SupportsFloat
不支持isinstance
检查。如果您唯一的选择是str
,float
和int
,则仅检查float
和int
或以其他方式拒绝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):
...
您的检查isinstance(a_val, Number)
的解决方案已结束。您只需要从Number
模块将Real
更改为numbers
。 Real数字支持转换为浮点数,因此它是检查的正确类型。警告不见了。完整代码示例:
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)