簡體   English   中英

如何在Eclipse / PyDev中抑制“未使用的變量”警告

[英]How to suppress “unused variable” warnings in Eclipse/PyDev

如何在Eclipse / PyDev中抑制“未使用的變量”警告

當我使用返回元組的函數時,我通常只需要其中一個值,但仍想分配給多個變量。 我希望能夠暫時關閉此警告,以便我可以解決更嚴重的問題。 然后,我可以在做更多的最終檢查時將其重新打開。

如果您想知道為什么我會故意這樣做,那只是為了可讀性。 假設一個函數返回一個元組元組,我的代碼的幾個部分可能與第三個值一起工作,如下所示:

label, content = myfunc()[2]

有時,我可能只對“內容”作品感興趣,但我發現這...

tmp, content = myfunc()[2]

...比這更平行(因此更具可讀性):

content = myfunc()[2][1]

如果有一個更好的方法來做到這一點而不分配一次性未使用的變量,請隨意提供它作為答案。

>>> myfunc()[2]
('lab', 'val')
>>> , v = myfunc()[2]
SyntaxError: invalid syntax
>>> tmp, v = myfunc()[2]
>>> 

如果您不需要變量的值,請將其分配給特殊變量_

就Python而言, _實際上並沒有什么特別之處; 它只是另一個合法的標識符名稱。

然而,對於大多數“lint”式工具(希望包括PyDev) - 更重要的是,人類讀者 - 它具有特殊意義“我不需要這個變量,我只是在這里放一些因為API /語法/任何需要它“。 這意味着他們不會警告你不使用它。

所以:

_, content = myfunc()[2]

是的,你是對的,這通常比myfunc()[2][1]更具可讀性。 不僅如此,它還可以幫助您捕獲更多錯誤 - 如果myfunc()[2]沒有正好兩個成員,則元組賦值將拋出,但[1]則不會。

非常非常罕見,這不是一個好主意,因為值是你希望盡快被垃圾收集的東西,並將它綁定到_而不是根本不綁定它(例如,通過[2][1] )推遲。

更嚴重的是,這確實與使用_特殊用法的另一個習慣用法沖突:使用gettext進行國際化的代碼通常會:

import gettext
_ = gettext.gettext

或者,等效地:

from gettext import gettext as _

顯然你不能使用_作為gettext快捷方式和無意義的標識符。 (其實你可以逃脫它,因為gettext意思是在模塊全球層面的約束,以及毫無意義的標識應該只是內部函數體中使用...但是,它仍然是一個非常糟糕的主意去嘗試,因為在某些時候你會在你分配了一個陰影它的局部值之后,最終在函數中使用gettext _ 。在任何一種情況下都沒有強迫你使用_但是如果你使用其他任何東西,你可能會混淆讀者(可能是相同的)你想要首先安撫的linting工具)。 因此,您必須在任何給定項目中決定哪一個對您更重要。 (通常,如果你使用gettext ,那將是更重要的一個。)

如果您反復調用myfunc並處理某些值,則可能需要考慮編寫包裝函數:

def mywrapperfunc():
    _, content = myfunc()[2]
    return content

然后你的代碼可以做:

content = mywrapperfunc()

這有許多優點:

  • 它顯然比任何需要你記住你想要的元組的后半部分更容易閱讀,這個元組位於myfunc返回的序列的索引2中。
  • 它為您提供了一個放置一個好名字(希望比mywrapperfunc更好)和/或評論/文檔字符串的地方,以防它不是微不足道的。
  • 這意味着如果你以后更改myfunc所以你想要的值現在是索引3而不是2,而3元素元組的第二個成員而不是2元素元組,你只需要改變mywrapperfunc而不是20個不同代碼行。
  • 這也意味着如果您以后想要使用沖突的_慣用法(例如,使用gettext將代碼用於i18n),您只需要在一個地方更改它。

一方面注意:在交互式解釋器中, _ 確實具有特殊含義:它與最后一個交互式命令的結果綁定在一起。 但這並不意味着您不能在交互式解釋器中使用_ (事實上​​,它在那里更好,因為你藏在那里的任何東西都會立即被覆蓋,所以非常罕見的GC問題不會出現。)

將注釋#@UnusedVariable添加到行尾。

PyDev中的每個警告都有類似的停用注釋。 使用“快速修復”來發現它們(將光標放在警告中並按Ctrl + 1),或者從PyDev源代碼中引用這些行:

public static final String MSG_TO_IGNORE_TYPE_UNUSED_IMPORT = "@UnusedImport";
public static final String MSG_TO_IGNORE_TYPE_UNUSED_WILD_IMPORT = "@UnusedWildImport";
public static final String MSG_TO_IGNORE_TYPE_UNUSED_VARIABLE = "@UnusedVariable";
public static final String MSG_TO_IGNORE_TYPE_UNDEFINED_VARIABLE = "@UndefinedVariable";
public static final String MSG_TO_IGNORE_TYPE_DUPLICATED_SIGNATURE = "@DuplicatedSignature";
public static final String MSG_TO_IGNORE_TYPE_REIMPORT = "@Reimport";
public static final String MSG_TO_IGNORE_TYPE_UNRESOLVED_IMPORT = "@UnresolvedImport";
public static final String MSG_TO_IGNORE_TYPE_NO_SELF = "@NoSelf";
public static final String MSG_TO_IGNORE_TYPE_UNDEFINED_IMPORT_VARIABLE = "@UndefinedVariable";
public static final String MSG_TO_IGNORE_TYPE_UNUSED_PARAMETER = "@UnusedVariable";
public static final String MSG_TO_IGNORE_TYPE_NO_EFFECT_STMT = "@NoEffect";
public static final String MSG_TO_IGNORE_TYPE_INDENTATION_PROBLEM = "@IndentOk";
public static final String MSG_TO_IGNORE_TYPE_ASSIGNMENT_TO_BUILT_IN_SYMBOL = "@ReservedAssignment";
public static final String MSG_TO_IGNORE_TYPE_PEP8 = "@IgnorePep8";
public static final String MSG_TO_IGNORE_TYPE_ARGUMENTS_MISATCH = "@ArgumentMismatch";

首選項 - > PyDev - >編輯器 - >代碼分析,“未使用”選項卡

找到for的設置

如果名稱以以下內容開頭,則不報告未使用的變量:(以逗號分隔)

然后使用此列表中的一個前綴,或添加另一個前綴。

例如,如果您在以下代碼中有一個一次性變量“tmp”:

tmp, content = myfunc()[2]

並且你的前綴列表中有'_'要忽略,然后將“tmp”轉換為“_tmp”,如下所示:

_tmp, content = myfunc()[2]

你的錯誤會消失。 我認為這是一個比使用'_'更可讀的解決方案,正如@abarnert所建議的那樣,它也避免了與翻譯沖突的復雜性。

當我使用與返回元組時描述的功能類似的功能時,我會遇到這種情況。 您可以在Preferences - > PyDev - > Editor - > Code Analysis部分中為PyDev的代碼分析全局設置警告級別。 在“未使用”選項卡的“代碼分析”中,可以選擇為“未使用的變量”以及其他事件設置警告級別。

或者,您可以使用額外的插件以任何語言(包括Python)抑制Eclipse中的給定警告。 http://suppresswarnings.drupalgardens.com

也適用於市場:

https://marketplace.eclipse.org/content/marker-manager

暫無
暫無

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

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