Python,下划线在括号之前做什么

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

label=_("Username")

通常我会在字符串周围使用一对引号。有人能给我解释一下“用户名”的下划线和括号是做什么的吗?

15101 次浏览

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

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

通常它被绑定到 ugettext可调用:

from django.utils.translation import ugettext as _

参见 Django 文档的 翻译章节:

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

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

_是一个可调用函数的名称(函数,可调用的对象)。它通常用于 gettext函数,比如在姜戈:

 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的别名:)