[issue28734] argparse: successive parsing wipes out nargs=? values
paul j3
report at bugs.python.org
Thu Jul 27 19:13:28 EDT 2017
paul j3 added the comment:
The problem described here is restricted to `?` and `*' positionals, and is caused by the subtle way in which 'empty' optional positionals are handled.
The regular handling of defaults at the start of `parse_known_args` works fine. The default is only written to the namespace if something isn't there already.
if not hasattr(namespace, action.dest):
if action.default is not SUPPRESS:
setattr(namespace, action.dest, action.default)
But a positional with ? or * is always 'seen' because an empty list of strings satisfies the nargs pattern. 'get_values()' has special handling for this case:
if not arg_strings and action.nargs == OPTIONAL:
....
value = action.default
That is, it replaces the empty list with the 'default'.
But take_action(), which does the actual saving, is conditional:
# take the action if we didn't receive a SUPPRESS value
# (e.g. from a default)
if argument_values is not SUPPRESS:
action(self, namespace, argument_values, option_string)
That explains why 'default=SUPPRESS' solves this issue.
It's enough to satisfy the OP's situation, but I don't think it's a robust fix.
I don't have a patch idea yet, but this probably should be reopened so there's a record of the potential problem.
More on the complications raised by these 'seen default actions' in
http://bugs.python.org/issue18943
----------
nosy: +paul.j3
status: closed -> open
_______________________________________
Python tracker <report at bugs.python.org>
<http://bugs.python.org/issue28734>
_______________________________________
More information about the Python-bugs-list
mailing list