diff --git a/Lib/argparse.py b/Lib/argparse.py index 0dbdd67a82f391..47bb65cd2f1975 100644 --- a/Lib/argparse.py +++ b/Lib/argparse.py @@ -584,8 +584,8 @@ def _metavar_formatter(self, action, default_metavar): if action.metavar is not None: result = action.metavar elif action.choices is not None: - choice_strs = [str(choice) for choice in action.choices] - result = '{%s}' % ','.join(choice_strs) + result = '{%s}' % ','.join(map(str, action.choices)) + # Constructing a string representation of a dictionary with choices from action.choices`` else: result = default_metavar @@ -633,8 +633,8 @@ def _expand_help(self, action): if hasattr(params[name], '__name__'): params[name] = params[name].__name__ if params.get('choices') is not None: - choices_str = ', '.join([str(c) for c in params['choices']]) - params['choices'] = choices_str + params['choices'] = ', '.join(map(str, params['choices'])) + #Convert the list of choices to a comma-separated string return self._get_help_string(action) % params def _iter_indented_subactions(self, action): @@ -743,7 +743,8 @@ def _get_action_name(argument): elif argument.dest not in (None, SUPPRESS): return argument.dest elif argument.choices: - return '{' + ','.join(argument.choices) + '}' + return '{%s}' % ','.join(map(str, argument.choices)) + #Construct a dictionary-like string representation from the choices else: return None @@ -2613,7 +2614,9 @@ def _check_value(self, action, value): # converted value must be one of the choices (if specified) if action.choices is not None and value not in action.choices: args = {'value': value, - 'choices': ', '.join(map(repr, action.choices))} + 'choices': ', '.join(map(str, action.choices))} + # Constructing a string representation of choices separated by ', ' and setting it as the value for the 'choices' key in the dictionary + msg = _('invalid choice: %(value)r (choose from %(choices)s)') raise ArgumentError(action, msg % args) diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py index 617b1721f3dbb1..c50aa136b44270 100644 --- a/Lib/test/test_argparse.py +++ b/Lib/test/test_argparse.py @@ -2361,7 +2361,9 @@ def test_wrong_argument_subparsers_no_destination_error(self): parser.parse_args(('baz',)) self.assertRegex( excinfo.exception.stderr, - r"error: argument {foo,bar}: invalid choice: 'baz' \(choose from 'foo', 'bar'\)\n$" + r"error: argument {foo,bar}: invalid choice: 'baz' \(choose from foo, bar\)\n$" + # Error message indicating an invalid choice ('baz') for the argument. Valid choices are 'foo' and 'bar'. + ) def test_optional_subparsers(self):