簡體   English   中英

如何配置 pylint 以獲得更高的准確性

[英]how to configure pylint for greater accuracy

從 pylint 獲得誤報

考慮這段代碼:

previous = None
for word in ['you', 'cannot', 'be', 'serious']:
    if previous is not None:
        print(previous[0], word)
    previous = word

這是 output(這里沒有驚喜):

$ python3 test.py
y cannot
c be
b serious

使用pylint檢查它會得到以下結果:

$ pylint3 test.py
No config file found, using default configuration
************* Module test
C:  1, 0: Missing module docstring (missing-docstring)
C:  1, 0: Constant name "previous" doesn't conform to UPPER_CASE naming style (invalid-name)
E:  4,14: Value 'previous' is unsubscriptable (unsubscriptable-object)

--------------------------------------------------------------------
Your code has been rated at -4.00/10 (previous run: -4.00/10, +0.00)

正如你所看到的, pylint已經基於previous被初始化為None的事實抱怨了表達式previous[0] ,即使當它具有該值時無法到達該語句。 此外,盡管在最后一行進行了賦值,但它抱怨命名風格是因為previous是一個常量。

問題:是否有任何合適的 pylint 配置可以避免此類誤報,而不會引入同樣明顯的誤報,如果是這樣,為什么這不是默認配置?

嘗試的解決方案:禁用測試(導致假陰性)

例如,我可以通過創建一個包含pylint3 --generate-rcfile的 output 的$HOME/.pylintrc並對其進行編輯以將unsubscriptable-object添加到禁用測試列表中,從而完全抑制unsubscriptable-object警告(見下disable=[MESSAGES CONTROL]部分)。

但是,如果我只是以這種方式禁用測試,然后驗證以下代碼:

"false negative"  # silence docstring warning (fair enough)

print(None[0])  # this line will fail

它告訴我:

$ pylint3 test2.py
Using config file /home/<myuser>/.pylintrc

--------------------------------------------------------------------
Your code has been rated at 10.00/10 (previous run: 10.00/10, +0.00)

所以僅僅禁用測試並不是真正的答案。

版本和平台信息

版本信息:

$ pylint3 --version
Using config file /home/<myuser>/.pylintrc
pylint3 1.8.3, 
astroid 1.6.0
Python 3.6.9 (default, Apr 18 2020, 01:56:04) 
[GCC 8.4.0]

平台: Ubuntu 18.04.4 LTS

Pylint 是一個 static 類型檢查器,具有該類型實用程序的所有限制。 它不會讀懂你的想法,它只會讀懂你的代碼。 它的目的是告訴你看起來可疑的代碼,有時你必須告訴它忽略某些事情,因為你實際上想這樣編寫程序。

如果你期望 Pylint 是一個完美無瑕的代碼納粹,它可以識別你的每一個錯誤,永遠不會忘乎所以,永遠不會錯過任何事情,你會失望的。 如果你認為它是一個友好的觀察者,可以在你運行程序之前發現你的一些錯誤,那么它是非常強大的。 我認為它是必不可少的工具,只要您不要求太多。

你說previous不是一個常數,但這不是 Pylint 使用這個術語的方式。 您在模塊的最外層縮進級別聲明previous ,因此它是全局的; Pylint 認為全局變量的唯一有效用途是常量。 因此錯誤。

要讓 pylint 接受任何格式的常量,請在資源配置文件中使用以下行:

const-rgx=[A-Za-z0-9_]{1,30}$

這就是我在找到默認設置后所做的,即

const-naming-style=UPPER_CASE

限制太多。

RC 文件很重要,IMO。 它使您可以對 Pylint 的功能進行大量控制。 如果你的 RC 文件被命名為 pylint.rc 你調用 pylint 帶有標志--rcfile=pylint.rc 根據環境的設置方式,您可能必須提供完整的路徑名。

使用所描述的配置,Pylint 毫無怨言地接受此代碼:

previous = ''
for word in ['you', 'cannot', 'be', 'serious']:
    if previous:
        print(previous[0], word)
    previous = word

這是相同的邏輯,但更容易理解,因為它清楚地表明 previous 是一個字符串。 所以 Pylint 確實幫助你編寫了更具可讀性的代碼。

有時還需要告訴 Pylint 停止抱怨某條線路。 在您的示例中,如果您真的想在 None 之前進行初始化,您所要做的就是添加一個內聯 pragma,如下所示:

previous = None
for word in ['you', 'cannot', 'be', 'serious']:
    if previous is not None:
        print(previous[0], word)   # pylint: disable=unsubscriptable-object
    previous = word

這是一個比您嘗試過的更好的解決方案,因為它僅在一行中解決了錯誤,並且相同錯誤的其他事件將被標記。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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