Issue 16360: argparse: comma in metavar causes assertion failure when formatting long usage message (original) (raw)

argparse suffers from a failing assertion when formatting a long usage message with an option whose metavar contains a comma. This can be seen in the attached testcase, which fails with,

Traceback (most recent call last): File "/home/ben/hi.py", line 24, in args = parser.parse_args() File "/usr/lib/python2.7/argparse.py", line 1688, in parse_args args, argv = self.parse_known_args(args, namespace) File "/usr/lib/python2.7/argparse.py", line 1720, in parse_known_args namespace, args = self._parse_known_args(args, namespace) File "/usr/lib/python2.7/argparse.py", line 1937, in parse_known_args self.error(('too few arguments')) File "/usr/lib/python2.7/argparse.py", line 2360, in error self.print_usage(_sys.stderr) File "/usr/lib/python2.7/argparse.py", line 2322, in print_usage self._print_message(self.format_usage(), file) File "/usr/lib/python2.7/argparse.py", line 2278, in format_usage return formatter.format_help() File "/usr/lib/python2.7/argparse.py", line 279, in format_help help = self._root_section.format_help() File "/usr/lib/python2.7/argparse.py", line 209, in format_help func(*args) File "/usr/lib/python2.7/argparse.py", line 330, in _format_usage assert ' '.join(opt_parts) == opt_usage AssertionError

This failure is apparently due to a regular expression used to wrap the usage message. The solution to this is unclear, but it seems to me using a regular expression here is a hack at best.

Thanks @paul.j3 for the PR. The PR in the linked issue was merged and I cannot reproduce the original assertion error in the latest 2.7 branch with the script.

$ ./python.exe Python 2.7.15+ (remotes/upstream/2.7:10be1d3f80, Sep 22 2018, 22:10:28) [GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)] on darwin Type "help", "copyright", "credits" or "license" for more information.

$ ./python.exe ../backups/bpo16360.py usage: bpo16360.py [-h] [-w TIME] [-r N] [-j TIME] [-W TIME] [-y COUNT|max|avg] [-o FILE] [-c CHANNEL[=LABEL],...] FILE [FILE ...] bpo16360.py: error: too few arguments

Thanks