Python math.isclose()的类型检查
基本上,我在PyCharm中的语句Python math.isclose()的类型检查,python,python-3.x,pycharm,Python,Python 3.x,Pycharm,基本上,我在PyCharm中的语句math.isclose(a_val,b_val) 预期类型为“SupportsFloat”,改为“Number” 最小的、可重复的示例如下 从数字导入数字 输入数学 a_val='123' b_val=123.4 如果isinstance(a值,编号)和isinstance(b值,编号): is_close=math.isclose(a_val,b_val,abs_tol=0.5) 实际上,a_val和b_val是从其他地方获取的,它们可能返回浮点、整数或字
math.isclose(a_val,b_val)
预期类型为“SupportsFloat”,改为“Number”
最小的、可重复的示例如下
从数字导入数字
输入数学
a_val='123'
b_val=123.4
如果isinstance(a值,编号)和isinstance(b值,编号):
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 wanring,应该做哪些更改?math.isclose
不支持任意的Number
实例。与大多数math
函数一样,math.isclose
需要可以转换为float
的参数。数字
可能类似于1+2j
,不能转换为float
。(另外,str
不起作用-它必须是带有\uuuuuuuuuuuuuuuuuuuuuuuuuuu
方法的东西。)
我本来打算建议使用键入.SupportsFloat
,但看起来我误读了代码,而且键入.SupportsFloat
不支持isinstance
检查。如果您唯一的选项是str
、float
和int
,那么可能最简单的方法就是检查float
和int
,或者换一种方法,只需拒绝str
:
if isinstance(a_val, (float, int)) and isinstance(b_val, (float, int)):
...
或
检查isinstance(a_val,Number)
的解决方案已接近。您只需从numbers
模块将Number
更改为Real
。数字支持转换为float,因此它是要检查的正确类型。警告也没有了。完整代码示例:
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)
在PyCharm类型检查器中看起来是边缘大小写。它发出警告是因为a_val
实际上是一个字符串,但因为math.isclose
调用在if语句中a_val
必须是一个数字才能首先到达那里。这两种情况是相互排斥的&我怀疑类型检查器弄错了。呼叫本身实际上是无法到达的。所以警告应该无关紧要。@rdas:不,PyCharm实际上知道发生了什么,但是检查Number
的类型是错误的。@user2357112如果您使用a_val
anint
,警告就会消失。这怎么可能?@rdas:可能是因为int
是传递给math.isclose
的有效类型。(如果你认为PyCharm根本不应该用a_val='123'
来检查If
主体的类型,因为它是不可访问的,我认为不可访问的代码仍然应该进行类型检查。此外,静态类型检查程序可能只记得“isinstance(a_val,str)
”而不是“type(a_val)is str
”,因此它认为a_val
可能是if
body中的某个str
/Number
多重继承子类的一个实例。)@user2357112hmm这可以解释它。但是,在一个不可访问的代码块中抛出该警告,而不是在一开始就警告代码块不可访问,这似乎很奇怪。优先权。谢谢你的明确解释!我确实尝试过使用键入.SupportsFloat
,但没有效果。我想使用isinstance(a_val,float)
,但当a_val=123
(int)时,它不起作用。你的答案可能就是我需要的解决方案。
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)