paul j3 <ajipa...@gmail.com> 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 <rep...@bugs.python.org> <https://bugs.python.org/issue41769> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com