2012-12-17 7 views
14

chciałbym realizować logikę tak w argparse:Python argparse: wzajemnie się wykluczają grupa z kilkoma kompatybilnymi argumentów

If argument A is selected, the user cannot select arguments B or C. 
B and C can both be selected 

Wygląda add_mutually_exclusive_group jest to, co chciałbym za to, ale wygląda na to tylko możliwe wybierz jedną opcję z wzajemnie wykluczającej się grupy, więc nie mogę umieścić wszystkich trzech we wzajemnie wykluczających się grupach.

Czy istnieje sposób, aby to zrobić w argparse?

+0

Czy rozważałeś po prostu sprawdzenie po argparse za pomocą if? – erikbwork

+2

Mogę, miło o argparse jest to, że obsługuje on komunikat o błędzie dla ciebie. –

+0

Chociaż mogłem dodać normalną grupę opcji, używając 'add_argument_group' do wykluczającej się wzajemnie grupy, ale to nie działa w ogóle (to tak, jakby w ogóle nie mieć wzajemnie wykluczającej się grupy). Prawdopodobnie lepszym wyborem jest napisanie niestandardowej akcji, która implementuje tego rodzaju logikę. To powinno być zbyt trudne do zrobienia. – Bakuriu

Odpowiedz

-1

Można zanegować znaczenie A, a następnie użyć akapitu. Parametry akapitu pozwalają określić, czy "Jeśli i tylko jeśli jest wybrane, użytkownik może wybrać B lub C."

http://docs.python.org/2/library/argparse.html

+3

To jest naprawdę zła odpowiedź bez przykładu. – Oz123

2

nie można było zrobić z argparse, jednak można to zrobić po argparse wyczerpał.

Oto przykład:

parser = argparse.ArgumentParser() 

# group 1 
parser.add_argument("-q", "--query", help="query", required=False) 
parser.add_argument("-f", "--fields", help="field names", required=False) 

# group 2 
parser.add_argument("-a", "--aggregation", help="aggregation", 
        required=False) 

używam tutaj opcje podane w skrypcie polecenia dla zapytań o MongoDB. Instancja collection może albo wywołać metodę aggregate, albo metodęz opcjonalnymi argumentami, dlatego widać, dlaczego dwa pierwsze argumenty są zgodne, a ostatni nie.

Więc teraz biegnę parser.parse_args() i sprawdzić jego zawartość:

args = parser().parse_args() 

print args.aggregation 
if args.aggregation and (args.query or args.fields): 
    print "-a and -q|-f are mutually exclusive ..." 
    sys.exit(2) 

Oczywiście, ten mały kilof pracuje tylko do prostych spraw i byłoby stać się koszmarem, aby sprawdzić wszystkie możliwe opcje, jeśli masz wiele wzajemnie ekskluzywne opcje i grupy. W takim przypadku należy podzielić opcje na grupy poleceń. W tym celu powinieneś postępować zgodnie z sugestią tutaj Python argparse mutual exclusive group.

1

Docopt może działać w tym przypadku.

Wykorzystuje rury do wzajemnie wykluczających się elementów.

my_program (aggregate | find [-q | -f]) 
+0

Jeśli nie musisz używać argparse w celu zachowania spójności ze swoim zespołem, użyj Docopt. Jeśli musisz użyć argparse, porozmawiaj z osobą, która może zdecydować inaczej, i pokaż im Docopt. Docopt sprawia, że ​​szybkie i bardzo łatwe do skonfigurowania skomplikowanych wymagań i zachowań, ponieważ argparse i to jest tak, to w zasadzie ogon macha psa. Nie znalazłem ani jednego przypadku, w którym nie mógłbym zrobić czegoś, czego faktycznie potrzebowałem w Docopt, co mogłem zrobić (i pracować) w argparse. – TinBane