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?
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.
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.
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
🙂
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?
It calls the function _
with the argument "Username"
, just like f("Username")
would call the function f
. Probably _
is a function for internationalising strings.
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 forgettext()
. 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 thangettext()
. Sometimes, you should be usingugettext_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 importingugettext()
as_()
avoids this problem.
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 forgettext()
. 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 importinggettext()
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
🙂