New submission from Mansour <mans...@oxplot.com>:

I have a web server written in python which takes an optional argument telling 
it what IP and port to bind to. Here's the definition:

parser.add_argument(
  '-b', '--bind',
  metavar="[ip]:port",
  type=unicode,
  help="IP and port to bind to."
)

There are several other arguments as well. When the usage is printed (due to 
parse failures or -h), if the command line is longer than terminal width, it is 
wrapped. Here is the (relevant) code in argparse.py:311 which deals with this 
scenario:

# wrap the usage parts if it's too long
text_width = self._width - self._current_indent 
if len(prefix) + len(usage) > text_width: 
 
  # break usage into wrappable parts 
  part_regexp = r'\(.*?\)+|\[.*?\]+|\S+' 
  opt_usage = format(optionals, groups) 
  pos_usage = format(positionals, groups) 
  opt_parts = _re.findall(part_regexp, opt_usage) 
  pos_parts = _re.findall(part_regexp, pos_usage) 
  assert ' '.join(opt_parts) == opt_usage
  assert ' '.join(pos_parts) == pos_usage

Note how part_regexp extracts words, and text surrounded with round/square 
brackets. Now the argument I defined above, when displayed in usage text, looks 
like this: [-b [ip]:port]

part_regexp however, will cut it into "[-b [ip]" and ":port]" and concatenated 
later with " ", it will have an extra space which causes the first assertion to 
fail.

I fiddled with part_regexp but that proved unreliable at best. I think the 
opt_parts should be obtained, not from the final formatted text, but from 
actual argument objects.

For a demonstration, see the attachment.

----------
components: Library (Lib)
files: argparse_wrap_test.py
messages: 153632
nosy: oxplot
priority: normal
severity: normal
status: open
title: argparse: assertion failure if optional argument has square/round 
brackets in metavar
type: crash
versions: Python 2.7
Added file: http://bugs.python.org/file24554/argparse_wrap_test.py

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

Reply via email to