Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python math.isclose()的类型检查_Python_Python 3.x_Pycharm - Fatal编程技术网

Python math.isclose()的类型检查

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是从其他地方获取的,它们可能返回浮点、整数或字

基本上,我在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
是从其他地方获取的,它们可能返回浮点、整数或字符串。如果
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
an
int
,警告就会消失。这怎么可能?@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)