[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