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

如何在 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 eclipse variable-assignment pydev


    【解决方案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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-17
        • 1970-01-01
        • 1970-01-01
        • 2020-01-02
        相关资源
        最近更新 更多