paul j3 <[email protected]> added the comment:
'store_true/false' are subclasses of 'store_const'. All have a 'nargs=0'
value. It's that value which explains their behavior. ('append_const' would
also fall in this category)
In [2]: parser = argparse.ArgumentParser()
In [3]: parser.add_argument('foo', action='store_const', default='xxx',
const='yyy')
Out[3]: _StoreConstAction(option_strings=[], dest='foo', nargs=0, const='yyy',
default='xxx', type=None, choices=None, help=None, metavar=None)
In [4]: _.required
Out[4]: True
In [5]: parser.print_help()
usage: ipython3 [-h]
positional arguments:
foo
optional arguments:
-h, --help show this help message and exit
In [6]: parser.parse_args([])
Out[6]: Namespace(foo='yyy')
In [7]: parser.parse_args(['zzz'])
usage: ipython3 [-h]
ipython3: error: unrecognized arguments: zzz
---
Like '*' and '?' this argument is 'satisfied' with nothing, an empty list of
values. For those nargs, 'get_values' takes a the special step of assigning
the default. For 'store_const' it's the 'const' that's placed in the
namespace. 'store_true' does store True, and 'store_false' does store False.
Providing a string produces an error because there isn't any Action to consume
it. With nargs=0, this Action can't use it. Usage is also correct since we
can't provide any string to meet this Action's needs.
Technically then the Action behaves correctly - both in usage and what it does.
That said, it normally isn't useful, since it will always assign the
'const/True/False' to the namespace. Even without an in depth knowledge of how
parsing is done, this should be logically evident (if not obvious).
I don't recall any previous issues like this, though I wouldn't be surprised if
there were. I don't recall anything on Stackoverflow either.
I think adding an error would be overkill. It doesn't come up often, and some
user might have their own obscure reason for using it.
A note to the docs might be in order, but until a user has encountered this
behavior as you have, such a note might be more confusing than useful.
As a general rule, parameter checking in add_argument() is rather loose (and
multilayered). While 'action' is used to select the Action subclass, most of
the rest are passed on to that Action. The Action __init__ check a few key
parameters (for example 'store_const' will complain if we don't provide a
'const'), but accept or ignore the rest.
----------
nosy: +paul.j3
_______________________________________
Python tracker <[email protected]>
<https://bugs.python.org/issue41769>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com