Python, what does an underscore before parenthesis do

Question:

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

label=_("Username")

Normally I would have just used a pair of quotes around the string. Can someone exaplain to me what the underscore and parenthesis around “Username” do?

Asked By: wobbily_col

||

Answers:

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

Answered By: Paul Hankin

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.
Answered By: Martijn Pieters

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 gettext 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 gettext() 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 🙂

Answered By: Maxime Lorant
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.