Mercurial/Python - 下划线功能有什么作用?

dim*_*414 6 python mercurial magic-function

在Mercurial中,许多扩展将其帮助/语法字符串包装在对下划线函数的调用中,如下所示:

 _('[OPTION] [QUEUE]')
Run Code Online (Sandbox Code Playgroud)

这让我感到困惑,因为它似乎没有必要(编写扩展指令没有提到它),并且似乎没有在类中定义_,所以我想知道这是否是一些特殊的语法我不喜欢不明白,或许可以用另一种方式来说lambda,或者也许是身份功能?另外,我想知道这种方法的好处(无论它是什么)仅仅是文档建议的原始字符串.

我在Python文档中看到的任何内容都没有提到这样的函数,所以我不确定这是一个Python问题还是一个Mercurial问题.

以下是使用此结构的两个示例(查看cmdtable文件底部附近的字典)

pto*_*ato 8

看看第45行:

from mercurial.i18n import _
Run Code Online (Sandbox Code Playgroud)

这是国际化包gettext中的通常缩写,也可能是其他包,对于将其参数的转换返回到程序当前运行的语言的函数.它的缩写是_为了方便,因为它几乎用于每一个消息显示给用户.

看起来像Mercurial将它包装在自己的模块中.("i18n"代表"国际化",因为"i"和"n"之间有18个字母.)


Ale*_*lli 7

_(单个下划线的函数名称)通常与国际化相关联,因为gettextGNU方法的先例也在Python的标准库中找到了一个位置(相同的架构,完全不同的实现) - 根据模块的文档,

gettext.install(domain[, localedir[, unicode[, codeset[, names]]]])
Run Code Online (Sandbox Code Playgroud)

这将_()在Python的内置命名空间中安装该函数,该命名空间基于传递给函数translation()的domain,localedir和codeset.unicode标志将传递给生成的转换对象的install()方法.

对于names参数,请参阅转换对象的install()方法的说明.

如下所示,您通常将应用程序中的字符串标记为要转换的字符串,方法是将它们包装在对_() 函数的调用中,如下所示:

print _('This string will be translated.') 
Run Code Online (Sandbox Code Playgroud)

为方便起见,您希望将_()函数安装在Python的内置命名空间中,以便在应用程序的所有模块中轻松访问它.

正如@ptomato所提到的,Mercurial通过命名_他们自己用于相同国际化目的的等效功能来遵循这一传统.

还有一个单独的传统_用作"我不关心"的标识符,如

fee, fie, _, _, foo, _, fum = thesevenitemstuple
Run Code Online (Sandbox Code Playgroud)

但当然你最好不要在同一个代码中同时使用这两种传统;-)