Как я могу получить имя аргумента из argparse?

Это мой скрипт командной строки

import argparse


parser = argparse.ArgumentParser('My command line app')

parser.add_argument('--start', type=start, metavar='HOST', dest='result', nargs='*', default='all', help='Start hosts')
parser.add_argument('--stop', type=stop, metavar='HOST', dest='result', nargs='*', default='all', help='Stop hosts')
parser.add_argument('--status', type=status, metavar='HOST', dest='result', nargs='*', default='all', help='Show hosts status')

args = parser.parse_args()

В настоящее время я определил одну функцию для каждой опции, но я хотел бы обернуть их только одной для этих трех опций. Тогда мне нужно было бы знать, какой аргумент был использован. Возможно ли это с argparse?

Решение

В итоге я пошел по этому пути:

import argparse


def wrapper(command, hosts):
    pass


parser = argparse.ArgumentParser('My script')
parser.add_argument('action', choices=['start', 'stop', 'status'], help='Action')
parser.add_argument('hosts', metavar='HOST', nargs='*', default='all')

args = parser.parse_args()

wrapper(args.action, args.hosts)

person Antonio Romero Oca    schedule 04.09.2015    source источник


Ответы (1)


Похоже, что более разумным способом справиться с этим был бы параметр choices:

commands = {'start': start, 'stop': stop, 'status': status}

parser = argparse.ArgumentParser('My command line app')
parser.add_argument('command', choices=commands.keys())
parser.add_argument('hosts', nargs='*', default=[])
args = parser.parse_args()

commands[args.command](*args.hosts)
person deceze♦    schedule 04.09.2015
comment
И как я могу получить список хостов для опции: python commandline.py --status 44.44.44.44 55.55.55.55 - person Antonio Romero Oca; 04.09.2015
comment
Я бы добавил их как отдельный параметр, как указано выше. Это изменяет CLI API на my.py start foo bar baz с только одной возможной командой на вызов вместо нескольких смешанных команд прямо сейчас, но мне это кажется намного более разумным. - person deceze♦; 04.09.2015
comment
Мне пришлось редактировать команды, потому что мне нужна только оболочка для трех опций, и в конце добавить args.command в качестве первого аргумента функции. Но действительно хороший ваш ответ, спасибо! - person Antonio Romero Oca; 04.09.2015