2016-08-23 14 views
5

chcę używać mój skrypt tak:argparse: Jak uczynić opcjonalne wykluczające się wzajemnie argumenty?

python test.py run 
python test.py stop 

i mój kod jest tak:

parser = argparse.ArgumentParser() 
command_group = parser.add_mutually_exclusive_group(required=True) 
command_group.add_argument('run', help='run it', action='store_true') 
command_group.add_argument('stop', help='stop it', action='store_true') 

kiedy go wykonać, wyjątek jest podniesione:

ValueError: mutually exclusive arguments must be optional 

tak Próbuję dodać required=False po dodaniu każdego argumentu. Następnie otrzymuję inny wyjątek:

TypeError: 'required' is an invalid argument for positionals 

Jestem zdezorientowany.

+0

Dlaczego warto używać grupy mutex zamiast ['choices'] (https://docs.python.org/3/library/argparse.html#choices)? – kennytm

Odpowiedz

4

Lepszym sposobem na to jest dodanie pojedynczego argumentu pozycyjnego, który może mieć dwie opcje. Skoro ma to być opcja, użyj nargs='?', co oznacza zero lub jeden razy:

parser = argparse.ArgumentParser() 
parser.add_argument('run', help='run or stop', nargs='?', choices=('run', 'stop')) 

Jeśli run jest podana wartość zostanie 'run'. Jeśli podasz stop, będzie to 'stop'. Jeśli żadna nie zostanie podana, będzie to None.


Jeśli naprawdę chcesz skorzystać z wzajemnie wykluczającej się grupy, nie jestem pewien, czy możesz to zrobić dokładnie tak, jak chcesz. Ci może jednak zrobić im argumentów opcjonalnych dodając myślnik:

import argparse 

parser = argparse.ArgumentParser() 
command_group = parser.add_mutually_exclusive_group() 
command_group.add_argument('-run', help='run it', action='store_true') 
command_group.add_argument('-stop', help='stop it', action='store_true') 

Oczywiście problem z tym jest to, że użytkownik musi również zapewnić myślnik, ale to rodzaj problemu można się spodziewać, jeśli ograniczasz się w ten sposób.

+0

Dzięki, to działa. Ale jak powinienem napisać kod, jeśli naprawdę chcę użyć grupy mutex? – huron

+0

@huron: Nie jestem pewien, czy potrafisz. Zobacz moją zredagowaną odpowiedź. – zondo

+0

Rozumiem. Dziękuję Ci! – huron

1

Można to osiągnąć z nargs='?'

parser = argparse.ArgumentParser() 
command_group = parser.add_mutually_exclusive_group() 
command_group.add_argument('run', help='run it', nargs='?') 
command_group.add_argument('stop', help='stop it', nargs='?') 

co pozwoliłoby na połączenie programu z

python test.py run 

lub

python test.py stop 

ale nie

python test.py run stop