Я добавляю subparsers в свой синтаксический анализатор для имитации функциональных возможностей подкоманд (например, код: Простое приложение командной строки в python - проанализируйте ввод пользователя?). Теперь я хочу добавить команду quit
subparser/command, которая не принимает аргументов и имеет действие "quit". Является ли это возможным? Как я могу это сделать?
Python argparse - добавить действие к subparser без аргументов?
Ответ 1
Документация для subcommands
дает два примера того, как идентифицировать подпараметр.
https://docs.python.org/dev/library/argparse.html#sub-commands
Один из них - дать add_subparsers
a dest
:
def do_quit(args):
# action
quit()
parser = ArgumentParser()
subparser = parser.add_subparsers(dest='cmd')
....
subparser.add_parser('quit')
...
args = parser.parse_args()
print args.cmd # displays 'quit'
if args.cmd == 'quit':
do_quit(args)
другой должен использовать set_defaults
для связывания подпарамера с функцией:
parser = ArgumentParser()
subparsers = parser.add_subparsers()
...
parser_quit = subparsers.add_parser('quit')
parser_quit.set_defaults(func=do_quit)
...
args = parser.parse_args()
args.func(args)
Дальше подумайте, вот путь, используя пользовательский Action
. Это похоже на _HelpAction
(который используется a -h
). Он вызывается позиционным аргументом с nargs=0
(или '?'). Такой аргумент всегда называется, хотя нет никаких строк для его соответствия (вернее, 0 строк соответствуют ему). Это логичное, но несколько неясное следствие того, как обрабатываются позиционные элементы.
class QuitAction(argparse.Action):
def __call__(self, parser, *args, **kwargs):
parser.exit(message="QUITTING\n")
p=argparse.ArgumentParser()
sp=p.add_subparsers(dest='cmd')
p1=sp.add_parser('quit')
p1.add_argument('foo', action=QuitAction, nargs='?', help=argparse.SUPPRESS)
p.parse_args(['quit'])
(при запуске в Ipython):
QUITTING
An exception has occurred, use %tb to see the full traceback.
SystemExit: 0