【问题标题】:Reason for Assignment to " _ " [duplicate]分配给“_”的原因[重复]
【发布时间】:2011-06-19 02:19:04
【问题描述】:

我在一些情况下看到过这种情况,例如,

按顺序拆包:

_, x = L.pop()  # e.g., L is a list of tuples

初始化容器:

X = _

所以显然这不是正式的 Python 语法的一个元素,而是我所知道的用途似乎是随意的。

所以我很好奇使用它的可能原因是什么,一般有什么优点(如果有的话)?

注意:我的问题与在脚本、模块等中使用“_”有关,但不是 在交互式提示下使用。在IDLE中,使用python打包的交互式解释器,以及在ipython中,“_”用作最近返回结果的占位符)。

【问题讨论】:

  • 我使用_(或允许的等效语言)来表示“丢弃”值。

标签: python programming-languages syntax idioms


【解决方案1】:

我已经看到它以两种方式使用。两者都作为一次性变量,但更常见的是作为国际化的文本包装器。

一次性变量

name, _ = 'bida.bombu.foo'.split('.', 1)

虽然我不推荐这个。改为“忽略”。

name, ignored = 'bida.bombu.foo'.split('.', 1)

更清楚了。

i18n 包装器

from zope.i18nmessageid import MessageFactory
_ = MessageFactory('my.domain')

label = _("The label text")

label 在这里将是一个“消息”,一个具有消息 ID 和域的对象,当呈现到用户界面(如网页)时,它将通过消息翻译成当前用户语言目录,以便标签以用户的本地语言结束。

_ 在这里使用是因为它简短且不引人注目。生成的代码 _("The label text") 看起来与字符串没有什么不同,而 MyDomainMessage("The label text") 看起来确实非常不同,而且更长。

【讨论】:

  • +1 建议不要将 _ 用作匿名变量。它容易混淆人们,并且与交互式解释器中的_ 发生冲突。
  • 尽管有您的建议,使用 _ 来忽略值已经成为 Python 的惯用方式,以至于它一直是 codified as a special case in PEP 634
【解决方案2】:

_ 是一个有点特殊的变量名。在 shell 中,它包含先前计算的表达式的值:

>>> 1+2
3
>>> _+4
7

在脚本中,它通常用作一次性变量,即。 e.出于语义原因需要但以后不会使用的一个。从语法上讲,它只是一个变量。

【讨论】:

    【解决方案3】:

    优点是它是单个字符并且是“无名”的。

    缺点是它经常用于 I18N,作为对 gettext.gettext() 的引用。

    【讨论】:

      【解决方案4】:

      我已经看到变量_ 在您不关心它会得到什么值时使用,或多或少类似于/dev/null 变量。

      在 python 哲学中,可读性比其他语言更重要,例如:

      x, y, _, w = getPoint()
      

      比其他替代方案更紧凑且更具可读性,表明您不关心结果的z 坐标。其他用途可能是

      for _ in xrange(10):
          print "Hello, world."
      

      def matrix(rows, columns):
          return [[0] * columns for _ in xrange(rows)]
      

      对于语言_ 确实是一个有效的标识符,即使在某些交互式 python 循环中它具有特殊含义。

      这种用作“匿名变量”的情况并不常见,但仍然存在,因此您可能会在现有代码中找到它。例如,PyChecker 不会报告有关上述matrix 函数的任何信息,但如果您使用“普通”变量名,它会报错。

      也有一些包给_ 一个明确定义的含义(gettext)。

      【讨论】:

      • 如果有人想知道,使用 '_' 作为静态分析器不会抱怨的一次性变量(PyLint 也忽略未使用的下划线变量)源于将其作为语言规范的其他语言。我知道的最早的例子是 Prolog,一种将未使用的变量标记为错误的语言。
      【解决方案5】:

      没有充分的理由在脚本中使用_。在使用交互式解释器时,如果您正在执行任何数学计算,并且您想要前一个表达式的结果,您可以使用_。 Python 教程在相同的上下文中介绍了_。我看到该行为是从某些 shell 行为继承而来的。

      在你的例子中:

      _, x = L.pop()
      

      会失败,因为 L.pop() 将返回单个值,并且您不能将其分配给两个变量,而且将值分配给具有特殊含义的 _ 也不是一个好主意。

      【讨论】:

      • pop() 可以很好地返回元组。 :)
      • @carl,发帖人说 L 是一个元组列表。试试吧。 ideone.com/Lwl65
      • 正如@carl 所说,pop() 适用于元组列表。试试`_, x = [(1,2)].pop()`
      • 好的,我看到了可以工作的用例。返回值是二元组。
      猜你喜欢
      • 2020-01-04
      • 2014-02-22
      • 2015-07-19
      • 1970-01-01
      • 2013-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      相关资源
      最近更新 更多