Python, what does an underscore before parenthesis do

后端 未结 3 800
鱼传尺愫
鱼传尺愫 2020-12-08 04:12

Looking through some of the Django code at authentication forms I noticed the following syntax

label=_(\"Username\")

Normally I would have

相关标签:
3条回答
  • 2020-12-08 04:56

    The _ is the name of a callable (function, callable object). It's usually used for the gettext function, 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.
    

    As the doc says:

    Python’s standard library gettext module installs _() into the global namespace, as an alias for gettext(). In Django, we have chosen not to follow this practice, for a couple of reasons:

    [...]

    The underscore character (_) is used to represent “the previous result” in Python’s interactive shell and doctest tests. Installing a global _() function causes interference. Explicitly importing ugettext() as _() avoids this problem.

    Even if it's a convention, it may not be the case in your code. But be reassured, 99.9% of the time _ is an alias for gettext :)

    0 讨论(0)
  • 2020-12-08 05:01

    It calls the function _ with the argument "Username", just like f("Username") would call the function f. Probably _ is a function for internationalising strings.

    0 讨论(0)
  • 2020-12-08 05:05

    The underscore is just another Python object, but by convention the gettext library scans for it to find translatable text.

    Usually it is bound to the ugettext callable:

    from django.utils.translation import ugettext as _
    

    See the translation chapter of the Django documentation:

    Python’s standard library gettext module installs _() into the global namespace, as an alias for gettext(). In Django, we have chosen not to follow this practice, for a couple of reasons:

    • For international character set (Unicode) support, ugettext() is more useful than gettext(). Sometimes, you should be using ugettext_lazy() as the default translation method for a particular file. Without _() in the global namespace, the developer has to think about which is the most appropriate translation function.
    • The underscore character (_) is used to represent “the previous result” in Python’s interactive shell and doctest tests. Installing a global _() function causes interference. Explicitly importing ugettext() as _() avoids this problem.
    0 讨论(0)
提交回复
热议问题