Mercurial/Python - 下划线函数的作用是什么?
在Mercurial中,很多扩展的帮助信息或语法字符串都是用一个叫做下划线的函数包裹起来,像这样:
_('[OPTION] [QUEUE]')
这让我有点困惑,因为看起来并不是必须的(编写扩展的说明里没有提到这一点),而且在这个类里似乎也没有定义一个下划线函数,所以我在想这是不是某种我不理解的特殊语法,可能是另一种写法,比如lambda,或者是身份函数?此外,我还想知道这种方法(不管它是什么)相比于文档建议的直接使用原始字符串有什么好处。
我在Python的文档中没有看到提到过这样的函数,所以我不确定这到底是Python的问题,还是Mercurial的问题。
这里有两个使用这种结构的例子(看看文件底部的cmdtable
字典)
2 个回答
在编程中,_
(一个单下划线的函数名)通常和国际化有关。这是因为有一个叫做gettext
的工具,它是GNU的一种做法,也在Python的标准库中找到了用武之地(虽然架构相似,但实现方式完全不同)。具体可以参考这个模块的文档。
gettext.install(domain[, localedir[, unicode[, codeset[, names]]]])
这个函数
_()
会被安装到Python的内置命名空间中,具体是根据传给translation()
函数的域、语言目录和编码集来决定的。unicode标志会被传递给生成的翻译对象的install()方法。关于names参数的详细信息,可以查看翻译对象的install()方法的描述。
通常,你会通过调用
_()
函数来标记你应用程序中需要翻译的字符串,像这样:
print _('This string will be translated.')
为了方便起见,你希望
_()
函数被安装到Python的内置命名空间中,这样在你应用程序的所有模块中都能轻松访问。
正如@ptomato提到的,Mercurial也遵循了这个传统,给他们自己用于国际化目的的相应函数命名为_
。
另外,还有一种传统是把_
用作“我不在乎”的标识符,比如:
fee, fie, _, _, foo, _, fum = thesevenitemstuple
当然,你最好不要在同一段代码中同时使用这两种传统;-)
看看第45行:
from mercurial.i18n import _
这是国际化包 gettext 中常用的缩写,可能其他包也会用到。这个函数的作用是把它的输入内容翻译成程序当前运行的语言。为了方便使用,它被简化成 _
,因为几乎每条显示给用户的信息都会用到这个函数。
看起来Mercurial把它放在了自己的模块里。(“i18n”是“国际化”的缩写,因为在“i”和“n”之间有18个字母。)