Issue 16786: argparse doesn't offer localization interface for "version" action (original) (raw)
In this patch I added the '_()' localization to the '_VersionAction' default 'help'.
While this is a straight forward change, I haven't tested it. It does run test_argparse.py, but that doesn't have any tests for localization.
According to the discussion here: https://mail.python.org/pipermail/python-dev/2010-May/100215.html this default help was originally None, and adding this string was seen as a worthwhile convenience. Localization was not considered.
Does this use of _() really save the user effort? May be it would if they are already using the depricated version. Otherwise they could just give the version argument their own non default help line. I haven't used localization enough to know.
Dear all,
As commented on PR 12711 (https://github.com/python/cpython/pull/12711#pullrequestreview-724899323), there is a slight issue with the proposed patch, as it translates the --version
help string as soon as the argparse
module is imported (at which point the programmer might not have correctly initialized the gettext
global domain yet). The suggested modification of PR 12711 should fix this, so that the translation only happens when an instance of _VersionAction
is actually created:
diff a/Lib/argparse.py b/Lib/argparse.py
--- a/Lib/argparse.py
+++ b/Lib/argparse.py
@@ -1042,7 +1042,9 @@ def __init__(self,
version=None,
dest=SUPPRESS,
default=SUPPRESS,
- help="show program's version number and exit"):
+ help=None):
+ if help is None:
+ help = _("show program's version number and exit")
super(_VersionAction, self).__init__(
option_strings=option_strings,
dest=dest,
However, I'm not sure I understand correctly Pavel's comment as to why merging this patch would make some old programs lose their translation for this string: since argparse
does not itself provide any translation, it is up to the programmers to provide gettext
translations for argparse
strings as well. Adding the call to _()
here seems harmless to me:
- if a program already has a
gettext
translation string for "show program's version number and exit", it will be used, as expected; - otherwise, if it hasn't (and relies on other mechanisms to translate this string), the string will remain untranslated, and the "custom" translation mechanisms will be able to process it as before.
In any case, my guess is that localized programs already explicitly pass a localized help string to the _VersionAction
constructor in order to circumvent the nonlocalized default help string:
parser.add_argument('-V', action='version', version='%(prog)s 3.9',
help=_("show program's version number and exit"))
These programs should also remain completely unaffected by this change.
Thanks!
Kind regards, Jérémie.