'Python, what does an underscore before parenthesis do
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?
Solution 1:[1]
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 :)
Solution 2:[2]
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.
Solution 3:[3]
It calls the function _ with the argument "Username", just like f("Username") would call the function f. Probably _ is a function for internationalising strings.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | |
| Solution 2 | |
| Solution 3 | Paul Hankin |
