You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
argparse mx_group is required, when action value equal default will be ignore #74349
bpo-18943: argparse: default args in mutually exclusive groups
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:
assignee=Noneclosed_at=<Date2017-04-26.06:01:41.281>created_at=<Date2017-04-26.02:33:05.582>labels= ['3.7', 'type-bug', 'library']
title='argparse mx_group is required, when action value equal default will be ignore'updated_at=<Date2017-04-27.10:06:35.609>user='https://github.com/mlouielu'
When adding mutually exclusive group and required is True, and the group argument has default value. If we type its default value, argparse will ignore the input and return argument is required
Strange, this will only trigger when that argument type is int.
mlouielu commented on Apr 26, 2017
mlouielumannequin
MannequinAuthor
More actions
Maybe documentation should note that:
"""
# error if this argument is not allowed with other previously
# seen arguments, assuming that actions that use the default
# value don't really count as "present"
"""
paulj3 commented on Apr 26, 2017
paulj3mannequin
Mannequin
More actions
And only for integers smaller than 257!
The problem is with this test in take_action function
# error if this argument is not allowed with other previously# seen arguments, assuming that actions that use the default# value don't really count as "present"ifargument_valuesisnotaction.default:
seen_non_default_actions.add(action)
forconflict_actioninaction_conflicts.get(action, []):
ifconflict_actioninseen_non_default_actions:
msg=_('not allowed with argument %s')
action_name=_get_action_name(conflict_action)
raiseArgumentError(action, msg%action_name)
Specifically with the
argument_values is not action.default
test. In CPython integers below 257 are unique, so that
In [33]: int('10') is 10
Out[33]: True
In [34]: int('257') is 257
Out[34]: False
(and strings from 'sys.argv' do not match in the 'is' sense with strings set via 'default'. So the problem is unique to small integers.)
The test is really meant to catch the default that is added in '_get_values()' for positionals with optional nargs ('?').
This issue was raised by some PyPy developers several years ago.
PyPy does not treat the small integers as unique. I'll have to dig around to see what the resolution was, if any.
For now the solution is to use a string '10' as the default.
paulj3 commented on Apr 26, 2017
paulj3mannequin
Mannequin
More actions
This issue was raised in 2013. The proposed patch is still pending
Activity
mlouielu commentedon Apr 26, 2017
When adding mutually exclusive group and required is True, and the group argument has default value. If we type its default value, argparse will ignore the input and return
argument is required------- PoC --------
mlouielu commentedon Apr 26, 2017
Strange, this will only trigger when that argument type is int.
mlouielu commentedon Apr 26, 2017
Maybe documentation should note that:
"""
# error if this argument is not allowed with other previously
# seen arguments, assuming that actions that use the default
# value don't really count as "present"
"""
paulj3 commentedon Apr 26, 2017
And only for integers smaller than 257!
The problem is with this test in
take_actionfunctionSpecifically with the
test. In CPython integers below 257 are unique, so that
(and strings from 'sys.argv' do not match in the 'is' sense with strings set via 'default'. So the problem is unique to small integers.)
The test is really meant to catch the default that is added in '_get_values()' for positionals with optional nargs ('?').
This issue was raised by some PyPy developers several years ago.
PyPy does not treat the small integers as unique. I'll have to dig around to see what the resolution was, if any.
For now the solution is to use a string '10' as the default.
paulj3 commentedon Apr 26, 2017
This issue was raised in 2013. The proposed patch is still pending
http://bugs.python.org/issue18943
I'm going to close this new one, though it is a good reminder of a rare, but persistent bug.
mlouielu commentedon Apr 26, 2017
Thanks, paul. Your msg help a lot.
Will you work on bpo-18943? I can help for this or review the pending patch.