在身份验证表单中查看一些Django代码,我注意到以下语法
label=_("Username")
通常我会在字符串周围使用一对引号。有人可以向我展示“用户名”周围的下划线和括号吗?
答案 0 :(得分:31)
_
是可调用的名称(函数,callable object)。它通常用于gettext
函数,for example in Django:
from django.utils.translation import ugettext 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测试中的“之前的结果”。安装全局_()
功能会导致干扰。明确导入ugettext()
作为_()
可以避免此问题。
即使它是惯例,代码中可能不是。但请放心,99.9%的时间_
是gettext
的别名:)
答案 1 :(得分:9)
下划线只是另一个Python对象,但按照惯例,gettext
库会扫描它以查找可翻译的文本。
通常它绑定到ugettext
callable:
from django.utils.translation import ugettext as _
请参阅Django文档的the translation chapter:
Python的标准库gettext模块将
_()
安装到全局命名空间中,作为gettext()
的别名。在Django,我们选择不遵循这种做法,原因有两个:
- 对于国际字符集(Unicode)支持,
ugettext()
比gettext()
更有用。有时,您应该使用ugettext_lazy()
作为特定文件的默认转换方法。如果全局命名空间中没有_()
,开发人员必须考虑哪个是最合适的翻译功能。- 下划线字符(
_
)用于表示Python的交互式shell和doctest测试中的“之前的结果”。安装全局_()
功能会导致干扰。明确导入ugettext()
为_()
可以避免此问题。
答案 2 :(得分:5)
它使用参数_
调用函数"Username"
,就像f("Username")
将调用函数f
一样。可能_
是一个国际化字符串的函数。