6

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

 _('[OPTION] [QUEUE]')

这让我感到困惑,因为它似乎没有必要(编写扩展指令没有提到它)并且似乎没有在类中定义 _,所以我想知道这是否是我没有的一些特殊语法'不明白,也许另一种说法是 lambda,或者也许是恒等函数?另外,我想知道这种方法(无论它是什么)的好处是像文档建议的那样仅对原始字符串有什么好处。

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

这里有两个使用这种结构的例子(查看cmdtable文件底部附近的字典)

4

2 回答 2

8

查看第 45 行:

from mercurial.i18n import _

这是国际化包gettext中的常用缩写,也可能是其他包中的常用缩写,用于返回其参数到程序当前运行的语言的翻译的函数。_为了方便起见,它被缩写为,因为它几乎用于所有向用户显示的消息。

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

于 2010-06-19T21:08:05.847 回答
7

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

gettext.install(domain[, localedir[, unicode[, codeset[, names]]]])

这会_()根据传递给函数 translation() 的域、localedir 和代码集将函数安装在 Python 的内置命名空间中。unicode 标志被传递给生成的翻译对象的 install() 方法。

names 参数请参见翻译对象的 install() 方法的说明。

如下所示,您通常通过将它们包装在对函数的调用中来标记应用程序中作为翻译候选者的字符串_() ,如下所示:

print _('This string will be translated.') 

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

正如@ptomato 所提到的,Mercurial 遵循了这一传统,命名_了他们自己用于相同国际化目的的等效函数。

还有一个单独的传统可以_用作“我不在乎”标识符,如

fee, fie, _, _, foo, _, fum = thesevenitemstuple

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

于 2010-06-19T21:21:35.813 回答