Он может создавать подпарамеры на основе аргументов функций.

ема

Я строю менеджер пакетов, который имеет много подкоманд. Я бы предпочел иметь структуру классов, аналогичную следующей.

class ListCommand:
  def __init__(self):
    name = "list"
    alias = "ls"
    short_description = "A useful simple line that explains the command"

  def help(self):
    # Display help

  def command(self):
    # do stuff when command is called

Как мне написать subparser для работы с чем-то вроде этого? Я нашелпример онлайн, который делает что-то подобное без подпарсеров.

 hpaulj06 окт. 2017 г., 00:36
Сначала поиграйте сsubparsers как описано в документации. Включитьset_defaults трюк. Я подозреваю, что как только вы сделаете это для нескольких подпарсеров, вы увидите, как сгенерировать эти подпарсеры из вашего класса. Если вы застряли, добавьте пример парсера к вашему вопросу.

Ответы на вопрос(1)

Решение Вопроса

Класс CMD и парсер:

import argparse

class Cmd:
  def __init__(self,name):
    self.name = name

  def __call__(self, args):
    # do stuff when command is called
    print('Executing %s'%self)
    print('args %s'% args)

  def make_sup(self,sp):
      self.parser = sp.add_parser(self.name)
      self.parser.add_argument('--foo')
      self.parser.set_defaults(action=self)

  def __repr__(self):
      return '<Cmd> %s'%self.name

cmds = []
cmds.append(Cmd('list'))
cmds.append(Cmd('foo'))
cmds.append(Cmd('bar'))
print(cmds)

parser = argparse.ArgumentParser()
sp = parser.add_subparsers(dest='cmd')
for cmd in cmds:
    cmd.make_sup(sp)
print(parser._defaults)

args = parser.parse_args()
print(args)
args.action(args)

пробные прогоны:

1834:~/mypy$ python stack46595691.py list --foo xxxx
[<Cmd> list, <Cmd> foo, <Cmd> bar]
{}
Namespace(action=<Cmd> list, cmd='list', foo='xxxx')
Executing <Cmd> list
args Namespace(action=<Cmd> list, cmd='list', foo='xxxx')
1837:~/mypy$ python stack46595691.py bar
[<Cmd> list, <Cmd> foo, <Cmd> bar]
{}
Namespace(action=<Cmd> bar, cmd='bar', foo=None)
Executing <Cmd> bar
args Namespace(action=<Cmd> bar, cmd='bar', foo=None)
1838:~/mypy$ python stack46595691.py foo -h
[<Cmd> list, <Cmd> foo, <Cmd> bar]
{}
usage: stack46595691.py foo [-h] [--foo FOO]

optional arguments:
  -h, --help  show this help message and exit
  --foo FOO

Вы также можете посмотреть наplac, пакет, который подклассыArgumentParser, https://pypi.python.org/pypi/plac

Он может создавать подпарамеры на основе аргументов функций.

Ваш ответ на вопрос