【问题标题】:Python, what does an underscore before parenthesis doPython,括号前的下划线有什么作用
【发布时间】:2014-01-04 12:26:55
【问题描述】:

查看身份验证表单中的一些 Django 代码,我注意到以下语法

label=_("Username")

通常我会在字符串周围使用一对引号。有人可以向我解释一下“用户名”周围的下划线和括号的作用吗?

【问题讨论】:

  • 检查你的导入状态,你会发现:from django.utils.translation import ugettext_lazy as _,你正在调用ugettext_lazy函数。阅读:When shoud I use ugettext_lazy?
  • 这真的很不直观。来自 Python 的明确 WFT,它以避免这些而自豪。

标签: python syntax


【解决方案1】:

_ 是可调用的名称(函数,callable object)。通常用于gettext函数,for example in Django

 from django.utils.translation import gettext as _
 print _("Hello!")  # Will print Hello! if the current language is English
                    # "Bonjour !" in French
                    # ¡Holà! in Spanish, etc.

正如文档所说:

Python 的标准库 gettext 模块将_() 安装到全局命名空间中,作为gettext() 的别名。在 Django 中,我们选择不遵循这种做法,原因如下:

[...]

下划线字符 (_) 用于表示 Python 的交互式 shell 和 doctest 测试中的“先前结果”。安装全局_() 函数会导致干扰。将gettext() 显式导入为_() 可避免此问题。

即使这是一个约定,在您的代码中可能并非如此。但请放心,99.9% 的时间 _gettext 的别名 :)

【讨论】:

  • 是的,我在导入时没有注意到。
  • ugettext("Hello!") 有什么问题?
  • @ZuLu 没有错,正如 Django 文档所说,使用 _ 作为别名是一种约定,因此您不必每次使用字符串时都编写“gettext”翻译你的代码。如果您在文件中只使用了几次 gettext,您可以放弃别名并直接使用 gettext(...),它会产生相同的效果。
【解决方案2】:

下划线只是另一个 Python 对象,但按照惯例,gettext 库会扫描它以查找可翻译文本。

通常它绑定到 ugettext 可调用对象:

from django.utils.translation import ugettext as _

参见 Django 文档的the translation chapter

Python 的标准库 gettext 模块将 _() 安装到全局命名空间中,作为 gettext() 的别名。在 Django 中,我们选择不遵循这种做法,原因如下:

  • 对于国际字符集 (Unicode) 支持,ugettext()gettext() 更有用。有时,您应该使用ugettext_lazy() 作为特定文件的默认翻译方法。如果全局命名空间中没有_(),开发人员必须考虑哪个是最合适的翻译函数。
  • 下划线字符 (_) 用于表示 Python 的交互式 shell 和 doctest 测试中的“先前结果”。安装全局_() 函数会导致干扰。将 ugettext() 显式导入为 _() 可避免此问题。

【讨论】:

    【解决方案3】:

    它使用参数"Username" 调用函数_,就像f("Username") 调用函数f 一样。可能_ 是一个国际化字符串的函数。

    【讨论】:

      最近更新 更多