25

如何在 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]
>>> 
4

5 回答 5

43

如果您不需要变量的值,请将其分配给特殊变量_

就 Python 而言,其实 ; 并没有什么特别之处_。它只是另一个合法的标识符名称,就像其他任何名称一样。

然而,对于大多数“lint”风格的工具(希望包括 PyDev)——更重要的是,人类读者——它具有特殊的含义,“我不需要这个变量,我只是在这里放一些东西,因为 API/语法/任何需要它的东西”。这意味着他们不会警告您不使用它。

所以:

_, content = myfunc()[2]

是的,你说得对,这通常比myfunc()[2][1]. 不仅如此,它还可以帮助您捕获更多错误——如果myfunc()[2]没有恰好两个成员,则元组赋值将抛出,但[1]不会。

非常非常罕见地,这不是一个好主意,因为该值是您希望尽快被垃圾收集的东西,并且将其绑定到_而不是根本不绑定它(例如, via [2][1])会延迟该值。

更严重的是,这确实与一个不同的习语冲突,该习语也特别使用_:gettext用于国际化的代码通常会:

import gettext
_ = gettext.gettext

或者,等效地:

from gettext import gettext as _

显然,您不能_同时用作 gettext 快捷方式和无意义的标识符。(你实际上可以侥幸逃脱,因为gettext含义是在模块全局级别绑定的,并且无意义的标识符应该只在函数体内使用......但是,尝试它仍然是一个非常糟糕的主意,因为在某些时候你会结束gettext _在你分配了一个隐藏它的本地值之后使用in 函数。)没有什么会强迫你_在任何一种情况下都使用 - 但如果你使用其他任何东西,你可能会混淆读者(并且可能与你相同的 linting 工具)重新寻求安抚首先)。因此,您必须决定在任何给定项目中哪个对您更重要。(通常,如果您使用gettext的是 ,那

如果您反复调用myfunc和处理某些值,您可能需要考虑编写一个包装函数:

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

然后你的代码可以做:

content = mywrapperfunc()

这有很多优点:

  • 它显然比任何需要你记住你想要一个元组的后半部分的东西更容易阅读,它位于返回的序列的索引 2 中myfunc
  • 它为您提供了一个放置好名字(希望比 更好mywrapperfunc)和/或注释/文档字符串的地方,以防万一。
  • 这意味着如果您稍后更改myfunc因此您想要的值现在在索引 3 而不是 2 中,并且 3 元素元组的第二个成员而不是 2 元素元组,您只需要更改mywrapperfunc而不是 20 行代码。
  • 这也意味着,如果您以后想使用冲突的_习惯用法(例如,将您的代码与gettext.

附注:在交互式解释器中,_ 确实有一个特殊的含义:它绑定到最后一个交互式命令的结果。但这并不意味着您不能_在交互式解释器中使用。(事实上​​,那里更好,因为你存储在那里的任何东西都会立即被覆盖,所以不会出现非常罕见的 GC 问题。)

于 2012-12-19T01:32:51.210 回答
23

将注释添加#@UnusedVariable到行尾。

PyDev 中的每个警告都有类似的停用注释。使用 Quick Fix 发现它们(将光标放在警告中并按 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";
于 2013-01-29T20:45:42.617 回答
5

首选项 -> PyDev -> 编辑器 -> 代码分析,“未使用”选项卡

找到设置

如果名称以:(逗号分隔)开头,则不要报告未使用的变量

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

例如,如果您在以下代码中有一个一次性变量“tmp”:

tmp, content = myfunc()[2]

并且您的前缀列表中有“_”要忽略,然后将“tmp”转换为“_tmp”,如下所示:

_tmp, content = myfunc()[2]

你的错误会消失。我认为这是一个比@abarnert 建议的仅使用“_”更具可读性的解决方案,它还避免了与翻译冲突的复杂性。

于 2013-07-25T17:47:22.507 回答
3

当我使用类似于您在返回元组时描述的功能时,我有时会遇到这种情况。您可以在 Preferences -> PyDev -> Editor -> Code Analysis 部分中全局设置 PyDev 代码分析的警告级别。在未使用选项卡的代码分析中,有一个选项可以设置“未使用变量”以及其他事件的警告级别。

于 2012-12-19T01:38:11.913 回答
0

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

也可在市场上购买:

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

于 2013-11-29T14:49:37.103 回答