paul j3 <ajipa...@gmail.com> added the comment:

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'.

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue36664>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to