Python, what does an underscore before parenthesis do
PythonSyntaxPython 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.