如何在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]
>>>
答案 0 :(得分:39)
如果您不需要变量的值,请将其指定给特殊变量_
。
就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
_
。)没有什么能够强迫您使用{{1}在任何一种情况下 - 但如果你使用其他任何东西,你可能会混淆读者(可能是你想要首先安抚的相同的linting工具)。因此,您必须在任何给定项目中决定哪一个对您更重要。 (通常情况下,如果你使用_
,这将是更重要的一个。)
如果您反复调用gettext
并处理某些值,您可能需要考虑编写包装函数:
myfunc
然后你的代码就可以了:
def mywrapperfunc():
_, content = myfunc()[2]
return content
这有许多优点:
content = mywrapperfunc()
返回的序列的索引2中更容易阅读。myfunc
更好)和/或评论/文档字符串的地方,以防它不是微不足道。mywrapperfunc
所以你想要的值现在是索引3而不是2,而3元素元组的第二个成员而不是2元素元组,你只需要更改myfunc
而不是20行不同的代码。mywrapperfunc
惯用法(例如,使用_
来代替您的代码),则只需在一个地方进行更改。一方面注意:在交互式解释器中,gettext
具有特殊含义:它与最后一个交互式命令的结果绑定。但这并不意味着您不能在交互式解释器中使用_
。 (事实上,它在那里更好,因为你藏在那里的任何东西都会立即被覆盖,所以非常罕见的GC问题不会出现。)
答案 1 :(得分:21)
将评论#@UnusedVariable
添加到该行的末尾。
PyDev中的每个警告都有类似的停用注释。使用“快速修复”发现它们(将光标置于警告中并按Ctrl + 1),或参考PyDev source code中的这些行:
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";
答案 2 :(得分:5)
偏好设置 - > PyDev - >编辑 - >代码分析,“未使用”选项卡
找到
的设置如果名称以:(逗号分隔)
开头,则不报告未使用的变量然后使用此列表中的一个前缀,或添加另一个前缀。
例如,如果您在以下代码中有一个一次性变量“tmp”:
tmp, content = myfunc()[2]
你要忽略的前缀列表中有'_',然后将“tmp”转换为“_tmp”,如下所示:
_tmp, content = myfunc()[2]
你的错误会消失。我认为这是一个比使用'_'更可读的解决方案,正如@abarnert所建议的那样,它也避免了与翻译冲突的复杂性。
答案 3 :(得分:3)
当我使用与返回元组时描述的功能类似的功能时,我会遇到这种情况。您可以在首选项 - >中全局设置PyDev代码分析的警告级别。 PyDev - >编辑 - >代码分析部分。在“未使用”选项卡的“代码分析”中,可以选择为“未使用的变量”以及其他事件设置警告级别。
答案 4 :(得分:0)
或者,您可以使用额外的插件在任何语言(包括Python)中抑制Eclipse中的给定警告。 http://suppresswarnings.drupalgardens.com
也适用于市场: