|
|
- # coding: utf-8
- #
- # Copyright © 2010—2014 Andrey Mikhaylenko and contributors
- #
- # This file is part of Argh.
- #
- # Argh is free software under terms of the GNU Lesser
- # General Public License version 3 (LGPLv3) as published by the Free
- # Software Foundation. See the file README.rst for copying conditions.
- #
- """
- Utilities
- ~~~~~~~~~
- """
- import argparse
- import inspect
-
- from argh import compat
-
-
- def get_subparsers(parser, create=False):
- """
- Returns the :class:`argparse._SubParsersAction` instance for given
- :class:`ArgumentParser` instance as would have been returned by
- :meth:`ArgumentParser.add_subparsers`. The problem with the latter is that
- it only works once and raises an exception on the second attempt, and the
- public API seems to lack a method to get *existing* subparsers.
-
- :param create:
- If `True`, creates the subparser if it does not exist. Default if
- `False`.
-
- """
- # note that ArgumentParser._subparsers is *not* what is returned by
- # ArgumentParser.add_subparsers().
- if parser._subparsers:
- actions = [a for a in parser._actions
- if isinstance(a, argparse._SubParsersAction)]
- assert len(actions) == 1
- return actions[0]
- else:
- if create:
- return parser.add_subparsers()
-
-
- def get_arg_spec(function):
- """
- Returns argument specification for given function. Omits special
- arguments of instance methods (`self`) and static methods (usually `cls`
- or something like this).
- """
- spec = compat.getargspec(function)
- if inspect.ismethod(function):
- spec = spec._replace(args=spec.args[1:])
- return spec
|