2013-04-07 21 views
5

Wiem, że nie ma sensu wiele argumentów pozycyjnych w wykluczającą się grupę, ponieważ nie można powiedzieć, kto jest kim. Ale muszę uwzględnić w tym JEDEN argument pozycyjny.Jak uwzględnić jeden argument pozycyjny w grupie wzajemnie się wykluczającej?

Co potrzebne:

$ myprogram -h 
usage: myprogram [-h] [--delete value | --update value | value] 

Gdzie pozycyjny value jest domyślną akcję (rodzaj "--include"). (myprogram bez argumentów również musi być prawidłowe).

Moja pierwsza próba (to nie działa):

parser = ArgumentParser() 
group = parser.add_mutually_exclusive_group() 
group.add_argument('--delete', metavar='value') 
group.add_argument('--update', metavar='value') 
group.add_argument('value') 

Czy to możliwe?


Druga próba:

parser = ArgumentParser() 
group = parser.add_mutually_exclusive_group() 
group.add_argument('--delete', action='store_true') 
group.add_argument('--update', action='store_true') 
group.add_argument('--insert', action='store_true', default=True) 
group.add_argument('value') 

Odpowiedz

8

bym to zrobić trochę inaczej:

parser = ArgumentParser() 
group = parser.add_mutually_exclusive_group() 
group.set_defaults(mode='insert') 
group.add_argument('--delete', action='store_const', dest='mode', const='delete') 
group.add_argument('--update', action='store_const', dest='mode', const='update') 
group.add_argument('--insert', action='store_const', dest='mode', const='insert') 
parser.add_argument('value', nargs='?') 
args = parser.parse_args() 

Jeśli dodatkowo chcemy, aby program --delete (bez opcji value) nie dodać

if args.mode != 'insert' and args.value: 
    parser.error("can't {} without a value argument".format(args.mode)) 

Należy pamiętać, że będzie to oznaczać, że program --insert (bez value) nadal działa. Możesz tego uniknąć przy odrobinie wysiłku przez ustawienie domyślnego mode na None, wykonanie powyższego sprawdzenia z args.mode is not None, a następnie wykonanie if args.mode is None: args.mode = 'insert' lub podobnego.

+0

+1 dobre podejście – msw

3

Twój składnia jest bardziej wyraźnie opisane jako:

myprogram {--insert|--update|--delete} value 

gdzie wymagana jest --insert domyślnie na true i wartości.

argparse może czujesz się jak żądanej składni musi dopasować swój model, gdy coś

if args.insert and (args.update or args.delete): 
    parser.print_help() 

jest znacznie bardziej oczywiste.

dodane w odpowiedzi na komentarz:

Tutaj jest pseudo-kod (co oznacza, że ​​nie przetestować go), który pokazuje w jaki sposób zaimplementować to:

parser.add_argument('--insert', action='store_true') 
parser.add_argument('--update', action='store_true') 
parser.add_argument('--delete', action='store_true') 
parser.add_argument('value') 
args = parser.parse_args(sys.argv) 
if ((args.insert and args.delete) or 
    (args.insert and args.update) or 
    (args.update and args.delete)): 
    # can't pick more than one, complain and quit 
elif not (args.update or args.delete): 
    # they specified no action so assume insert 
    args.insert = True 

# now one and only one of insert/update/delete is 
# True and args.value contains the argument 

Mam nadzieję, że sprawia, że ​​rzeczy bardziej jasne.

+0

Dzięki za odpowiedź, ale nie w pełni rozumiem: I nie dodać " --insert 'argument i ustaw wartość domyślną True. Ta część działała.Ale wywołanie 'myprogram' bez argumentów kończy się niepowodzeniem, ponieważ' value' jest wymagana. Może w ogóle Cię nie rozumiem ... – borges

+0

Proszę zaktualizować pytanie nowym kodem lub otworzyć nowe pytanie, ponieważ nie mogę przeczytać tego, czego nie widzę. Podejrzewam, że próbowałeś zachować wzajemnie_wyjątkowe_ grupy, które nie są potrzebne. – msw

+0

Zaktualizowałem pytanie. – borges

3

Dokonać pozycyjnym argumentu opcjonalnego

parser = ArgumentParser() 
group = parser.add_mutually_exclusive_group() 
group.add_argument('--delete', metavar='value') 
group.add_argument('--update', metavar='value') 
group.add_argument('value', nargs='?') 

użycie jest wtedy (z '?'):

usage: ipython [-h] [--delete value | --update value | value] 
Powiązane problemy