-
-
Notifications
You must be signed in to change notification settings - Fork 31k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Positional arguments with boolean actions behave differently #85935
Comments
argparse allow the use of Given the following Python code:
The output is:
Note that the positional argument is not shown in the When any string parameter is given, the result is:
(add to the end of the output the value of the argument.) Even if the use of a positional value is not the best way to describe boolean parameter (optional arguments provide a much better interface for such values), if argparse is to support positional boolean values they should work as other positional arguments. I'd suggest raising an error if store_true or store_false is used along with positional values. |
You think the behavior is wrong. Does it disagree with the doc? If not, this is an design change (enhancement) issue limited to future version. If so, it might be a bug that can be backported. However, when I run the code on Windows with an argument I do not get an error, but get the same usage message as without. Adding quotes on the command line makes no difference. |
'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. |
I don't think many users will try to use a boolean positional argument. I only excited this behavior because I was writing an abstraction over argparse to define the command line interface based on a configuration file, and I was trying to add some type checking. I think documenting the behavior is enough. |
See also #97848, |
There are checks for 'store' and 'append' actions: if nargs == 0:
raise ValueError('nargs for store actions must be != 0; if you '
'have nothing to store, actions such as store '
'true or store const may be more appropriate') if nargs == 0:
raise ValueError('nargs for append actions must be != 0; if arg '
'strings are not supplying the value to append, '
'the append const action may be more appropriate') They were here from the initial release of argparse. There are also few general checks in So there are precedences. We can either add checks in constructors of I wonder if there is a case for an "anchor" action. For example, subparsers could have a positional argument with |
Raise ValueError in add_argument() if either explicit nargs=0 or action that does not consume arguments (like 'store_const' or 'store_true') is specified for positional argument.
Check also specific error messages.
Check also specific error messages.
…4891) Check also specific error messages.
…ythonGH-124891) Check also specific error messages. (cherry picked from commit 2c050d4) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
…gparse (pythonGH-124891) Check also specific error messages. (cherry picked from commit 2c050d4) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
…GH-124891) (GH-124898) Check also specific error messages. (cherry picked from commit 2c050d4) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
…GH-124891) (GH-124901) Check also specific error messages. (cherry picked from commit 2c050d4)
…honGH-125302) (cherry picked from commit 07c2d15) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
…honGH-125302) (cherry picked from commit 07c2d15) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
…124839) Raise ValueError in add_argument() if either explicit nargs=0 or action that does not consume arguments (like 'store_const' or 'store_true') is specified for positional argument.
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
Linked PRs
The text was updated successfully, but these errors were encountered: