通过查看身份验证表单中的一些 Django 代码,我注意到了以下语法
label=_("Username")
通常我会在字符串周围使用一对引号。有人能给我解释一下“用户名”的下划线和括号是做什么的吗?
它使用参数 "Username"调用函数 _,就像 f("Username")调用函数 f一样。可能 _是一个将字符串国际化的函数。
"Username"
_
f("Username")
f
下划线只是另一个 Python 对象,但是按照惯例,gettext库会扫描它以查找可翻译的文本。
gettext
通常它被绑定到 ugettext可调用:
ugettext
from django.utils.translation import ugettext as _
参见 Django 文档的 翻译章节:
Python 的标准库 gettext 模块将 _()作为 gettext()的别名安装到全局名称空间中。在 Django,我们选择不遵循这种做法,有几个原因: 对于国际字符集(Unicode)支持,ugettext()比 gettext()更有用。有时,您应该使用 ugettext_lazy()作为特定文件的默认翻译方法。如果全局名称空间中没有 _(),开发人员就必须考虑哪个是最合适的翻译函数。 下划线字符(_)用于表示 Python 交互式 shell 和 doctest 测试中的“前一个结果”。安装全局 _()函数会引起干扰。将 ugettext()显式导入为 _()可以避免这个问题。
Python 的标准库 gettext 模块将 _()作为 gettext()的别名安装到全局名称空间中。在 Django,我们选择不遵循这种做法,有几个原因:
_()
gettext()
ugettext()
ugettext_lazy()
_是一个可调用函数的名称(函数,可调用的对象)。它通常用于 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()显式导入为 _()可以避免这个问题。
[...]
下划线字符(_)用于表示 Python 交互式 shell 和 doctest 测试中的“前一个结果”。安装全局 _()函数会引起干扰。将 gettext()显式导入为 _()可以避免这个问题。
即使它是一个约定,在您的代码中也是 也许并非如此。但请放心,99.9% 的情况下 _是 gettext的别名:)