New submission from Sam Franklin <sjfrankli...@gmail.com>:
When argparse wraps the usage text, it can fail its assertion tests with whitespace differences. This can occur when metavar="", needed if a user wishes to avoid having a metavar print. It also could occur if a user specifies any other whitespace. Here's a minimum example (depending on $COLUMNS): import argparse # based on Vajrasky Kok's script in https://bugs.python.org/issue11874 parser = argparse.ArgumentParser(prog='PROG') parser.add_argument('--nil', metavar='', required=True) parser.add_argument('--a', metavar='a' * 165) parser.parse_args() This produces the AssertionError at the bottom of this comment. A solution is to have the two asserts ignore whitespace. I'll submit a pull request very shortly for this. (First time so happy for any comments or critiques!) A more extensive example: import argparse # based on Vajrasky Kok's script in https://bugs.python.org/issue11874 parser = argparse.ArgumentParser(prog='PROG') parser.add_argument('--nil', metavar='', required=True) parser.add_argument('--Line-Feed', metavar='\n', required=True) parser.add_argument('--Tab', metavar='\t', required=True) parser.add_argument('--Carriage-Return', metavar='\r', required=True) parser.add_argument('--Carriage-Return-and-Line-Feed', metavar='\r\n', required=True) parser.add_argument('--vLine-Tabulation', metavar='\v', required=True) parser.add_argument('--x0bLine-Tabulation', metavar='\x0b', required=True) parser.add_argument('--fForm-Feed', metavar='\f', required=True) parser.add_argument('--x0cForm-Feed', metavar='\x0c', required=True) parser.add_argument('--File-Separator', metavar='\x1c', required=True) parser.add_argument('--Group-Separator', metavar='\x1d', required=True) parser.add_argument('--Record-Separator', metavar='\x1e', required=True) parser.add_argument('--C1-Control-Code', metavar='\x85', required=True) parser.add_argument('--Line-Separator', metavar='\u2028', required=True) parser.add_argument('--Paragraph-Separator', metavar='\u2029', required=True) parser.add_argument('--a', metavar='a' * 165) parser.parse_args() This is related to https://bugs.python.org/issue17890 and https://bugs.python.org/issue32867. File "/minimum_argparse_bug.py", line 7, in <module> parser.parse_args() File "/path/to/cpython/Lib/argparse.py", line 1758, in parse_args args, argv = self.parse_known_args(args, namespace) File "/path/to/cpython/Lib/argparse.py", line 1790, in parse_known_args namespace, args = self._parse_known_args(args, namespace) File "/path/to/cpython/Lib/argparse.py", line 1996, in _parse_known_args start_index = consume_optional(start_index) File "/path/to/cpython/Lib/argparse.py", line 1936, in consume_optional take_action(action, args, option_string) File "/path/to/cpython/Lib/argparse.py", line 1864, in take_action action(self, namespace, argument_values, option_string) File "/path/to/cpython/Lib/argparse.py", line 1037, in __call__ parser.print_help() File "/path/to/cpython/Lib/argparse.py", line 2483, in print_help self._print_message(self.format_help(), file) File "/path/to/cpython/Lib/argparse.py", line 2467, in format_help return formatter.format_help() File "/path/to/cpython/Lib/argparse.py", line 281, in format_help help = self._root_section.format_help() File "/path/to/cpython/Lib/argparse.py", line 212, in format_help item_help = join([func(*args) for func, args in self.items]) File "/path/to/cpython/Lib/argparse.py", line 212, in <listcomp> item_help = join([func(*args) for func, args in self.items]) File "/path/to/cpython/Lib/argparse.py", line 336, in _format_usage assert ' '.join(opt_parts) == opt_usage AssertionError ---------- components: Library (Lib) messages: 350117 nosy: sjfranklin priority: normal severity: normal status: open title: argparse wrapping fails with metavar="" (no metavar) type: crash versions: Python 2.7, Python 3.5, Python 3.6, Python 3.7, Python 3.8, Python 3.9 _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue37910> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com