Python中的下划线(" _ ")有什么用?
我在一些场合见过这个符号,比如:
在序列解包的时候:
_, x = L.pop() # e.g., L is a list of tuples
用来初始化一个容器:
X = _
所以很明显,这并不是Python语法中的正式元素,而我知道的用法似乎是随意的。
我很好奇它使用的可能原因是什么,以及一般来说有什么好处(如果有的话)?
注意:我的问题是关于在脚本、模块等中使用“_”这个符号,但不包括在交互式提示符下的用法。在IDLE(Python自带的交互式解释器)和ipython中,“_”被用作最近返回结果的占位符。
5 个回答
7
_
是一个有点特别的变量名。在命令行中,它保存的是上一个计算结果的值:
>>> 1+2
3
>>> _+4
7
在脚本中,它通常被用作一个临时变量,也就是说,这个变量是为了语义上的需要而存在,但之后不会再用到。语法上,它和其他变量没有区别。
7
优点是它只有一个字符,而且没有名字。
缺点是它经常被用来处理国际化(I18N),作为对 gettext.gettext()
的引用。
34
我见过这个符号用两种方式。一个是作为临时变量,另一个更常见的是用作国际化的文本包装器。
临时变量
name, _ = 'bida.bombu.foo'.split('.', 1)
不过我不太推荐这样做。可以叫它“被忽略的”变量。
name, ignored = 'bida.bombu.foo'.split('.', 1)
这样更清楚。
国际化包装器
from zope.i18nmessageid import MessageFactory
_ = MessageFactory('my.domain')
label = _("The label text")
label
在这里指的是一个“消息”,它是一个包含消息ID和域的对象。当它被显示在用户界面(比如网页)上时,会通过消息目录翻译成当前用户的语言,这样用户看到的标签就会是他们的本地语言。
_
在这里使用是因为它简短且不显眼。生成的代码 _("The label text")
看起来和普通字符串没什么不同,而 MyDomainMessage("The label text")
看起来就很不一样,而且也长得多。