Python,括号前的下划线是做什么的

wob*_*col 32 python syntax

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

label=_("Username")
Run Code Online (Sandbox Code Playgroud)

通常我会在字符串周围使用一对引号.有人可以向我展示"用户名"周围的下划线和括号吗?

Max*_*ant 35

_是可调用的(函数,可调用对象)的名称.它通常用于gettext函数,例如在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.
Run Code Online (Sandbox Code Playgroud)

正如文件所说:

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

[...]

下划线字符(_)用于表示Python的交互式shell和doctest测试中的"先前结果".安装全局_()功能会导致干扰.明确导入ugettext()_()避免了这个问题.

即使它是一种约定,但在您的代码中可能并非如此.但要放心,99.9%的时间_是别名gettext:)

  • 是的,我在进口中没有注意到它。 (2认同)

Mar*_*ers 10

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

通常它绑定到ugettextcallable:

from django.utils.translation import ugettext as _
Run Code Online (Sandbox Code Playgroud)

请参阅Django文档的翻译章节:

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

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


Pau*_*kin 5

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