为何Pylint判定NaN冗余比较?如何正确比较含NaN的相等性?
NaN检测与相等性判断问题解答
1. value != value检测NaN的性能与Pylint提示
value != value是标准且性能最优的NaN检测方式——根据IEEE754标准,NaN是唯一不等于自身的值。从性能上看,这是字节码级的直接比较,没有函数调用开销,比math.isnan()更快。
Pylint报的R0124属于误判,它默认认为x != x是无意义的冗余比较,但这是针对NaN的合法写法。解决方法有两种:
- 在代码行尾加注释忽略提示:
if value != value: # pylint: disable=R0124 - 在Pylint配置文件中针对这类场景禁用该规则
2. 包含NaN的两值相等性判断
分两种业务场景处理:
- 遵循IEEE754标准:直接用
a == b即可,此时NaN不等于任何值(包括另一个NaN) - 需要将NaN视为相等(比如你的JSON补丁工具场景):自定义判断逻辑,示例代码:
这种逻辑能让两个NaN被判定为相等,适配JSON补丁工具对扩展NaN值的对比需求。def equal_with_nan(a, b): # 先判断两者是否都是NaN if a != a and b != b: return True # 否则用常规相等判断 return a == b
3. 自定义类中math.isnan()报错的解决
math.isnan()仅支持原生数值类型(int、float等),自定义类如果未实现数值转换协议,调用时会抛出TypeError。解决思路:
- 方案一:在自定义类中实现
__float__()方法,让类实例可以转换为浮点型,适配math.isnan() - 方案二:继续使用
value != value的方式,这种写法不依赖类型,只要自定义类实现了__ne__方法且符合NaN的行为(自身不相等),就能正常检测
内容的提问来源于stack exchange,提问作者Nice Zombies
相关产品推荐
相关产品推荐

