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

Reply via email to