Python, what does an underscore before parenthesis do

PythonSyntax

Python Problem Overview


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?

Python Solutions


Solution 1 - Python

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 :)

Solution 2 - Python

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.

Solution 3 - Python

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionwobbily_colView Question on Stackoverflow
Solution 1 - PythonMaxime LorantView Answer on Stackoverflow
Solution 2 - PythonMartijn PietersView Answer on Stackoverflow
Solution 3 - PythonPaul HankinView Answer on Stackoverflow