Python 中未使用的变量命名

40

可能重复:
如何避免在for循环中声明未使用的变量?

在Python中,如果一个变量不需要使用,最佳实践是什么?这似乎是一个奇怪的问题,但采用我的特定情况来举例说明:我有一个(key, value)元组,但我只对value感兴趣。以下是我的使用示例:

some_stuff = [("key", "value"), ("key2", "value")]
for _, value in some_stuff:
    pass  # TODO: do something really important with value

我注意到在Eclipse中,给一个变量命名为_或者带有_前缀(例如_k)将不会显示未使用的变量警告,而去除_前缀将导致警告出现。但这可能只是Eclipse中的一个奇怪之处/“特性”,而不是Python最佳实践。


1
个人而言,即使不使用“key”,我也会在某些情况下使用for key, value in some_stuff:。毕竟,它可能在未来被使用。变量应该说明它所包含的内容,而不是说“我不需要被使用”。 - pepr
未来的访客:PEP 640 -- 未使用变量语法 - user26742873
4个回答

37

我不确定这是否是Eclipse的问题,但通常我使用'_'来表示我不关心的值(即元组中的返回值或for循环中的索引值)。

当然,你也可以像以前一样使用变量名dummyignore

我不确定PEP 8是否提到了这个问题,不过查一下也许会有帮助。


@TomHennigan 我也看了一下,特别是这部分 命名规范,但也没有发现什么。 - Levon
11
请注意,在Python shell中,下划线“_”被用作魔法变量...字符串通常被标记为_("some string")以进行翻译。 - Joran Beasley
@JoranBeasley 说得好,但只有当程序设置为使用gettext或类似的东西时才会出现这种情况 - 默认情况下不存在这种方法。 - dimo414
2
@Levon 请看这里:http://docs.python.org/library/gettext.html @dimo414 您对于翻译是正确的,但是 Python shell 使用它来存储最后一个值,例如 >>>5+3\n>>>print _ 将打印 8。 - Joran Beasley
2
所有这些都说,只要你不使用shell或者在忽略变量时使用'_'进行翻译,这是非常普遍且完全可以的(即使你使用翻译,也可以将其映射到其他内容,'_'只是约定俗成)。 - Joran Beasley
显示剩余2条评论

20
这是Python编码规范,是的。最佳实践是在您不关心设置的值时使用_,例如当从元组中解包值时。然而,有时需要这样做表明您可能正在以非Pythonic的方式做其他事情。 _作为前缀用于表示“私有”方法和变量,如Phil Cooper所说。使用此选项可指示这些方法不属于任何其他模块可以或应依赖的公共合同的一部分。
一些参考资料:

实际上,“_”符号只有一个用法表示“未使用”的变量。另一个解释是在某些结构中表示“最后使用的值”,或者是具有最后操作结果的变量的隐含名称。因此,意见不一,它不应该被普遍用于此目的。 - pepr
2
在交互式Python shell中,_可用于方便地作为上次使用的值。在Python脚本中,情况并非如此。不能保证在所有情况下都提供该功能,但是根据惯例,它可以用于清楚地表示“我不关心此变量的当前值”在整个Python中。 - dimo414

4
让��们从...开始。
>>> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
...
Readability counts.
Special cases aren't special enough to break the rules.

我建议选择那些不存疑的方式。通常意味着选择一些自我解释、简单易懂的方法。如果你坚持要表达“未使用”的意思,那么考虑使用名称unused或者dummy如何?
如果可能,是否应该使_更加“隐形”,隐藏起来甚至成为被忽视的候选项?
对于Perl用户而言,_代表的含义与“未使用”不同。即使你不关心Perl用户,但是如果你之前从未遇到过_,它对你来说又代表什么?

1
这是一个有趣的表述方式,我倾向于同意。我想,至少当一个新手来到你的代码并阅读时,如果变量只被称为key,他们不会跳到谷歌上寻找Python中_的特殊含义。 - Tom Hennigan
1
你说得对,我并不是很关心Perl用户。 - Tom Hennigan

2
您已经基本理解了_1的含义:
  • 一个前导下划线意味着,是的,它存在,您可以查看它,但最好使用其他方法或属性;请参阅文档。
  • 两个前导下划线意味着,危险!不要碰它,否则会严重破坏状态和稳定性。请远离它;如果您搞砸了它,如果出现问题,那是您自己的责任。

注意:使用__不仅仅是命名约定,还会导致名称重整。这将变量重命名为_ClassName__var,使得变量/方法更难在类外部使用。这主要是为了避免继承类中的子类意外覆盖父类中的方法。


这个下划线是用于局部变量(例如在函数或循环中)还是只用于实例变量,以便为半私有性而混淆名称?我认为我没有看到它在除了实例变量之外的任何地方使用过。 - Tom Hennigan
不,通常不会用于本地变量,因为__表示的是特殊含义。在函数、循环等中的变量将在函数返回时进行垃圾回收,所以不需要担心。最好使用没有_修饰符/标志的有意义的名称。 - Phil Cooper
1
__ 前缀用于名称混淆。在 Python 中,将其用于其他任何目的都不是良好的实践。 _ 前缀表示“请勿触摸此项”-约定是,如果您在类外部依赖这些属性,则有破坏风险。 - Daenyth
@Daenyth -1...真的吗。我以为我已经说过了。有时候我不是那么会说话。 - Phil Cooper
1
当前的文本意味着它可以/应该用于面向对象编程中的“私有”性,这是一个常见的错误。它被用来避免名称冲突并将变量绑定到一个特定的类名上。 - Daenyth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接