New submission from Federico Bond <federico.b...@gmail.com>:

The call to 'ngettext' in 'ArgumentParser._match_argument' (Lib/argparse.py) 
uses a non-integer value, which causes it to fail with a nonsensical exception. 
Non-integer values were deprecated in bpo-28692.

This happens because the 'default' error message is computed unconditionally, 
even when the value of 'action.nargs' is 'None' and another message will be 
ultimately selected.

This issue is similar to bpo-35785 which was not reproduced by other people at 
the moment and was eventually closed. I could not create a short reproducer but 
could match several of the points described in that issue. A little debugging 
turned up that gettext was loading a catalog from the 'natural' PyPI package 
which uses 'Plural-Forms' too.

  File 
"/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python3.7/argparse.py",
 line 1755, in parse_args
    args, argv = self.parse_known_args(args, namespace)
  File 
"/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python3.7/argparse.py",
 line 1787, in parse_known_args
    namespace, args = self._parse_known_args(args, namespace)
  File 
"/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python3.7/argparse.py",
 line 1993, in _parse_known_args
    start_index = consume_optional(start_index)
  File 
"/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python3.7/argparse.py",
 line 1923, in consume_optional
    arg_count = match_argument(action, selected_patterns)
  File 
"/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python3.7/argparse.py",
 line 2086, in _match_argument
    action.nargs) % action.nargs
  File 
"/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python3.7/gettext.py",
 line 631, in ngettext
    return dngettext(_current_domain, msgid1, msgid2, n)
  File 
"/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python3.7/gettext.py",
 line 610, in dngettext
    return t.ngettext(msgid1, msgid2, n)
  File 
"/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python3.7/gettext.py",
 line 462, in ngettext
    tmsg = self._catalog[(msgid1, self.plural(n))]
  File "<string>", line 4, in func
  File 
"/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python3.7/gettext.py",
 line 168, in _as_int
    (n.__class__.__name__,)) from None
TypeError: Plural value must be an integer, got NoneType

----------
components: Library (Lib)
messages: 356761
nosy: Federico Bond
priority: normal
severity: normal
status: open
title: argparse calls ngettext with deprecated non-integer value
type: crash
versions: Python 3.8, Python 3.9

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue38821>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to