[英]Pylint redundant comparison for NaN
為什么 Pylint 認為這是一個多余的比較? 這不是檢查 NaN 的最快方法嗎?
重構:R0124
冗余比較 - value_1 != value_1
冗余比較 - value_2 != value_2
我還應該如何檢查兩個值是否相等,包括當它們為 nan 時?
NaN = float("NaN")
def compare(value_1, value_2):
match_nan = value_1 != value_1
print(match_nan and
value_2 != value_2 or
value_1 == value_2)
compare(1, 1)
compare(1, NaN)
compare(NaN, 1)
compare(NaN, NaN)
輸出:
True
False
False
True
現在,如果您正在使用自定義類,那么 math.is_nan 肯定是更好的解決方案:
from math import isnan
class NotEQ:
def __eq__(self, other):
return False
not_eq = NotEQ()
print(not_eq != not_eq)
print(isnan(not_eq))
輸出:
True
... TypeError: must be real number, not NotEQ
我正在編寫一個 JSON 修補程序,我認為當您希望能夠從列表中刪除它們時,正常行為不是很有用,或者如果兩個值不相等則引發錯誤(但允許 NaN 和 NaN)
每當您將常量或變量與自身進行比較時,pylint 都會拋出此問題。 I case of a variable it compares the name (see _check_logical_tautology
in the source )。 因此,您可以通過像這樣重命名比較的一側來避免這種情況:
def compare(value_1, value_2):
v_1 = value_1
v_2 = value_2
match_nan = v_1 != value_1
print(match_nan and v_2 != value_2 or value_1 == value_2)
至少要擺脫 linting 問題。 不過,我也會聽從 wjandrea 的建議並尋求How can I check for NaN values?
使用math.isnan(x)
; 它和x != x
一樣快。 說x != x
最快的答案是使用錯誤的測試(我在那里發表評論來解釋)。 這是一個固定版本:
In [1]: %%timeit x = float('nan')
...: x != x
...:
...:
36 ns ± 0.51 ns per loop (mean ± std. dev. of 7 runs, 10,000,000 loops each)
In [2]: %%timeit x = float('nan'); from math import isnan
...: isnan(x)
...:
...:
35.8 ns ± 0.282 ns per loop (mean ± std. dev. of 7 runs, 10,000,000 loops each)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.