diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2024-10-12 11:46:28 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-10-12 11:46:28 (GMT) |
commit | a6c0c64de0ade400df7995f1e9480b6fc0f863aa (patch) | |
tree | d48eb4b42b7f9c0e04bd15fe4c4105b7694a2ce3 | |
parent | eb2d268ac7480b5e2b4ffb9a644cad7ac75ae954 (diff) | |
download | cpython-a6c0c64de0ade400df7995f1e9480b6fc0f863aa.zip cpython-a6c0c64de0ade400df7995f1e9480b6fc0f863aa.tar.gz cpython-a6c0c64de0ade400df7995f1e9480b6fc0f863aa.tar.bz2 |
gh-59330: Improve error message for dest= for positionals (GH-125215)
Also improve the documentation. Specify how dest and metavar are derived
from add_argument() positional arguments.
Co-authored-by: Simon Law <sfllaw@sfllaw.ca>
-rw-r--r-- | Doc/library/argparse.rst | 19 | ||||
-rw-r--r-- | Lib/argparse.py | 3 | ||||
-rw-r--r-- | Lib/test/test_argparse.py | 3 |
3 files changed, 23 insertions, 2 deletions
diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst index d337de8..19f8320 100644 --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -636,6 +636,25 @@ be positional:: usage: PROG [-h] [-f FOO] bar PROG: error: the following arguments are required: bar +By default, argparse automatically handles the internal naming and +display names of arguments, simplifying the process without requiring +additional configuration. +As such, you do not need to specify the dest_ and metavar_ parameters. +The dest_ parameter defaults to the argument name with underscores ``_`` +replacing hyphens ``-`` . The metavar_ parameter defaults to the +upper-cased name. For example:: + + >>> parser = argparse.ArgumentParser(prog='PROG') + >>> parser.add_argument('--foo-bar') + >>> parser.parse_args(['--foo-bar', 'FOO-BAR'] + Namespace(foo_bar='FOO-BAR') + >>> parser.print_help() + usage: [-h] [--foo-bar FOO-BAR] + + optional arguments: + -h, --help show this help message and exit + --foo-bar FOO-BAR + .. _action: diff --git a/Lib/argparse.py b/Lib/argparse.py index 208c182..64dbd71 100644 --- a/Lib/argparse.py +++ b/Lib/argparse.py @@ -1424,7 +1424,8 @@ class _ActionsContainer(object): chars = self.prefix_chars if not args or len(args) == 1 and args[0][0] not in chars: if args and 'dest' in kwargs: - raise ValueError('dest supplied twice for positional argument') + raise ValueError('dest supplied twice for positional argument,' + ' did you mean metavar?') kwargs = self._get_positional_kwargs(*args, **kwargs) # otherwise, we're adding an optional argument diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py index 000b810..61ddb5f 100644 --- a/Lib/test/test_argparse.py +++ b/Lib/test/test_argparse.py @@ -5411,7 +5411,8 @@ class TestInvalidArgumentConstructors(TestCase): parser.add_argument(dest='foo') with self.assertRaises(ValueError) as cm: parser.add_argument('bar', dest='baz') - self.assertIn('dest supplied twice for positional argument', + self.assertIn('dest supplied twice for positional argument,' + ' did you mean metavar?', str(cm.exception)) def test_no_argument_actions(self): |