【问题标题】:Mercurial/Python - What Does The Underscore Function Do?Mercurial/Python - 下划线函数有什么作用?
【发布时间】:2011-03-05 20:51:06
【问题描述】:

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

 _('[OPTION] [QUEUE]')

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

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

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

【问题讨论】:

    标签: python mercurial magic-function


    【解决方案1】:

    查看第 45 行:

    from mercurial.i18n import _
    

    这是国际化包gettext 中的常用缩写,也可能是其他包中的常用缩写,用于将其参数转换为程序当前运行的语言的函数。为方便起见,缩写为_ ,因为它几乎用于向用户显示的每条消息。

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

    【讨论】:

    • 啊哈哈!好的谢谢!因此,如果有人想以自己的语言运行它,这是为了方便 - 但他们仍然必须提供/提交自己的翻译,对吗?如果我使用 gettext,我不需要自己提供,对吗?
    • @dimo414,使用标准库的 gettext(以及 GNU 自己的其他语言),您肯定希望提供您自己的翻译 -- @987654326 @ 的代码所做的是获取和使用那些翻译后的短语,它肯定在不同的自然语言之间进行自动机器翻译!!!
    • @Alex,对不起,我不清楚 - 问题是关于期望,而不是功能。从“提供完整的程序”的角度来看,我应该自己创建这些翻译,还是认为我可以在没有它们的情况下发布代码?
    • @dimo414,发布没有翻译的代码很好,但要允许其他人编写和安装他们自己的翻译,你应该分发基本的.po文件,请参阅@ 987654322@了解更多。
    • 所以这就是称它为“i18n”的原因。我一直在想,所以谢谢:-)
    【解决方案2】:

    _(单个下划线的函数名称)通常与国际化相关联,这是由于gettext 的先例,这是一种 GNU 方法,在 Python 的标准库中也占有一席之地(相同的架构,完全不同的实现) -- 每the module's docs,

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

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

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

    如下所示,您通常标记 应用程序中的字符串 翻译候选人,由 将它们包装在对_() 的调用中 函数,像这样:

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

    为方便起见,您 想要安装_() 功能 在 Python 的内置命名空间中,所以它 在所有模块中都可以轻松访问 你的申请。

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

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

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

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

    【讨论】: