如果您不需要变量的值,请将其分配给特殊变量_。
就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 问题。)