This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author paul.j3
Recipients Peter McEldowney, nemeskeyd, paul.j3
Date 2019-11-01.01:51:17
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1572573078.16.0.192410872328.issue36664@roundup.psfhosted.org>
In-reply-to
Content
Just clarify how the code currently works.  `subparsers` is a positional Action of subclass _SubParsersAction.  It has a nargs='+...', requiring at least one string, and taking all remaining strings.  Its __call__ has the standard signature.  So everything that's special about subparsers is embodied in this Action subclass.  

    def __call__(self, parser, namespace, values, option_string=None):
        parser_name = values[0]
        arg_strings = values[1:]

        # set the parser name if requested
        if self.dest is not SUPPRESS:
            setattr(namespace, self.dest, parser_name)

        # select the parser
        try:
            parser = self._name_parser_map[parser_name]
        ...

So the `parser_name` is first string, the actual alias that user provided.  It is added to the namespace if a `dest` was provided (the default `dest` is SUPPRESS).  That's all of the relevant code - the alias is simply added to to Namespace.

As mentioned before `parser_name` is used find the actual sub parser, which is called with the remaining `arg_strings`.

Earlier in the subclasses `add_parser` method, the 'name' and 'alias' list are used to populate the '_name_parser_map' mapping, and also create the metavar that's used in the help display.  But neither is saved as an attribute.

---

I still think 'set_defaults' is the cleanest way of saving a unique name for a sub parser.

    parser_foo.set_defaults(func=foo, name='foo')

---

One further note - if you make subparsers required, you should also set a dest name:

    parser.add_subparsers(dest='cmd', required=True)

otherwise the missing-subparsers error message will raise an error.  It needs to identify the missing action in some way.  Functionally, this might be the most important reason to set the 'dest'.
History
Date User Action Args
2019-11-01 01:51:18paul.j3setrecipients: + paul.j3, nemeskeyd, Peter McEldowney
2019-11-01 01:51:18paul.j3setmessageid: <1572573078.16.0.192410872328.issue36664@roundup.psfhosted.org>
2019-11-01 01:51:18paul.j3linkissue36664 messages
2019-11-01 01:51:17paul.j3create