簡體   English   中英

NaN 的 Pylint 冗余比較

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM