基本上,我在声明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的影响?
答案 0 :(得分:3)
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):
...
答案 1 :(得分:3)
您的检查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)