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

时间:2014-01-04 12:26:55

标签: python syntax

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

label=_("Username")

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

3 个答案:

答案 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一样。可能_是一个国际化字符串的函数。