Jon*_*mbs 22 python eclipse pydev variable-assignment
如何在Eclipse/PyDev中抑制"未使用的变量"警告
当我使用返回元组的函数时,我通常只需要其中一个值,但仍想分配给多个变量.我希望能够暂时关闭此警告,以便我可以解决更严重的问题.然后,我可以在做更多的最终检查时将其重新打开.
如果您想知道为什么我会故意这样做,那只是为了可读性.假设一个函数返回一个元组元组,我的代码的几个部分可能与第三个值一起工作,如下所示:
label, content = myfunc()[2]
Run Code Online (Sandbox Code Playgroud)
有时,我可能只对"内容"作品感兴趣,但我发现这...
tmp, content = myfunc()[2]
Run Code Online (Sandbox Code Playgroud)
...比这更平行(因此更具可读性):
content = myfunc()[2][1]
Run Code Online (Sandbox Code Playgroud)
如果有一个更好的方法来做到这一点而不分配一次性未使用的变量,请随意提供它作为答案.
>>> myfunc()[2]
('lab', 'val')
>>> , v = myfunc()[2]
SyntaxError: invalid syntax
>>> tmp, v = myfunc()[2]
>>>
Run Code Online (Sandbox Code Playgroud)
aba*_*ert 40
如果您不需要变量的值,请将其分配给特殊变量_.
就Python而言,实际上并没有什么特别之处_; 它只是另一个合法的标识符名称.
然而,对于大多数"lint"式工具(希望包括PyDev) - 更重要的是,人类读者 - 它具有特殊意义"我不需要这个变量,我只是在这里放一些因为API /语法/任何需要它".这意味着他们不会警告你不使用它.
所以:
_, content = myfunc()[2]
Run Code Online (Sandbox Code Playgroud)
是的,你是对的,这通常比可读性更强myfunc()[2][1].不仅如此,它还可以帮助您捕获更多错误 - 如果myfunc()[2]没有正好两个成员,则元组赋值将抛出,但[1]不会.
非常非常罕见,这不是一个好主意,因为价值是你希望尽快被垃圾收集的东西,并将其绑定到_而不是根本不绑定它(例如,通过[2][1])延迟.
更严重的是,这确实与另一个也特别使用的习语相冲突_:gettext用于国际化的代码通常会:
import gettext
_ = gettext.gettext
Run Code Online (Sandbox Code Playgroud)
或者,等效地:
from gettext import gettext as _
Run Code Online (Sandbox Code Playgroud)
显然,您不能同时使用_gettext快捷方式和无意义的标识符.(你可以真正摆脱它,因为gettext意思是在模块全球层面的约束,以及毫无意义的标识应该只是内部函数体中使用...但是,它仍然是一个非常糟糕的主意去尝试,因为在某些时候你会结束gettext _在分配了影响它的局部值之后使用函数中的函数.)_在任何一种情况下都没有强制使用- 但如果你使用其他任何东西,你可能会混淆读者(并且可能会使用相同的linting工具)首先要寻求安抚).因此,您必须在任何给定项目中决定哪一个对您更重要.(通常,如果你正在使用gettext,那将是更重要的一个.)
如果您反复调用myfunc并处理某些值,则可能需要考虑编写包装函数:
def mywrapperfunc():
_, content = myfunc()[2]
return content
Run Code Online (Sandbox Code Playgroud)
然后你的代码可以做:
content = mywrapperfunc()
Run Code Online (Sandbox Code Playgroud)
这有许多优点:
myfunc.mywrapperfunc)和/或评论/文档字符串的地方,以防它不是微不足道的.myfunc所以你想要的值现在是索引3而不是2,而3元素元组的第二个成员而不是2元素元组,你只需要改变mywrapperfunc而不是20个不同的行码._习惯用法(例如,使用您的代码gettext),您只需要在一个地方更改它.一方面注意:在交互式解释器中,_ 确实有一个特殊含义:它与最后一个交互式命令的结果绑定在一起.但这并不意味着您无法_在交互式解释器中使用.(事实上,它在那里更好,因为你藏在那里的任何东西都会立即被覆盖,所以非常罕见的GC问题不会出现.)
jos*_*hua 22
将注释添加#@UnusedVariable到行尾.
PyDev中的每个警告都有类似的停用注释.使用"快速修复"来发现它们(将光标放在警告中并按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";
Run Code Online (Sandbox Code Playgroud)
首选项 - > PyDev - >编辑器 - >代码分析,"未使用"选项卡
找到for的设置
如果名称以以下内容开头,则不报告未使用的变量:(逗号分隔)
然后使用此列表中的一个前缀,或添加另一个前缀.
例如,如果您在以下代码中有一个一次性变量"tmp":
tmp, content = myfunc()[2]
Run Code Online (Sandbox Code Playgroud)
并且你的前缀列表中有'_'要忽略,然后将"tmp"转换为"_tmp",如下所示:
_tmp, content = myfunc()[2]
Run Code Online (Sandbox Code Playgroud)
你的错误会消失.我认为这是一个比使用'_'更可读的解决方案,正如@abarnert所建议的那样,它也避免了与翻译冲突的复杂性.
| 归档时间: |
|
| 查看次数: |
17738 次 |
| 最近记录: |