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