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

Posted

技术标签:

【中文标题】如何在 Eclipse/PyDev 中抑制“未使用的变量”警告【英文标题】:How to suppress "unused variable" warnings in Eclipse/PyDev 【发布时间】:2012-12-06 07:46:41 【问题描述】:

当我使用返回元组的函数时,我通常只需要其中一个值,但仍想分配给多个变量。我希望能够暂时关闭此警告,以便在更严重的问题上归零。然后,我可以在进行更多最终检查时将其重新打开。

如果您想知道我为什么要故意这样做,那只是为了便于阅读。假设一个函数返回一个元组的元组,我的代码的几个部分可能会像这样使用第三个值:

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]
>>> 

【问题讨论】:

【参考方案1】:

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

就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 更好)和/或 cmets/docstrings 的地方,以防万一。 这意味着如果你以后改变myfunc所以你想要的值现在在索引3而不是2,并且是3元素元组的第二个成员而不是2元素元组,你只需要改变mywrapperfunc 而不是 20 行不同的代码。

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

【讨论】:

_gettext 使用,因此如果您的应用程序是国际化的,可能并不总是一个很好的选择 @gnibbler:好点子。实际上,_ 实际上并没有被gettext 使用,但是使用_ = gettext.gettext 或等效项是惯用的,这几乎是一回事。无论如何,如果你这样做,你显然不能使用_ 作为无意义的标识符。我会更新答案。 @abarnert:感谢您提供如此完整的解释!现在 sid16rgt 已将我引导至可配置且信息丰富的设置对话框,我看到默认设置会忽略 _ 或 dummy 甚至 _drop,或者我可以调整设置以适应像 drop 这样的本土设置。【参考方案2】:

在行尾添加注释#@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";

【讨论】:

其他方法让我觉得更方便/更透明,但这绝对是了解 Eclipse 警告的好消息。谢谢! (+1)【参考方案3】:

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

查找设置

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

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

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

tmp, content = myfunc()[2]

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

_tmp, content = myfunc()[2]

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

【讨论】:

【参考方案4】:

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

【讨论】:

这真的不是一个好的解决方案。警告是有充分理由的。在 Python 中,当您的意思是 foobar = func() 时,很容易编写类似 foobra = func() 的内容,因此您最终会创建另一个变量,而不是更新 foobar。这种问题让人抓狂。但是,如果您从不故意创建未使用的变量名,则 linter 可以为您捕获这些和类似的问题(因为它们等同于意外创建未使用的变量名)。因此,除非您正在处理大量无法修复的代码,否则请留下警告并修复您的代码。 我同意印刷错误很容易产生,并且抑制这样的警告有其缺点。我经常发现自己从回报中扩展变量,以使其他变量保持在我可以在精神上跟随我得到的回报的状态。有时我会使用它们。有时不是。出于这个原因,我保留我的警告,但其他人,如 OOP,可能想要禁用它们。我想做的只是告诉我如何做。 谢谢 (+1)——Eclipse 中的各种设置有点分散,所以我没有注意到 Window, Preferences 下的这一部分。同一个对话框还有一种方法可以禁用特定变量名的警告,这甚至比暂时关闭警告更好;默认值为:“虚拟,_,未使用”。 我的意思是说默认是开头的变量名:“dummy, _, used”。 这在某些情况下非常好,我正在使用 cython 并不断收到 duplicate signature 警告,如果不是这个修复程序会非常烦人!【参考方案5】:

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

也可以在市场上购买:

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

【讨论】:

以上是关于如何在 Eclipse/PyDev 中抑制“未使用的变量”警告的主要内容,如果未能解决你的问题,请参考以下文章

在 Eclipse(Pydev) 中将命令行参数传递给 Python 脚本

在 Eclipse Pydev 控制台和 Idle 中打印 Unicode

Eclipse,PyDev“未指定项目解释器”

python+Eclipse+pydev环境搭建

调试 python 在 Eclipse ( pydev ) 中终止

在 Eclipse / PyDev 中使用 msvcrt.getch()