2013-08-02 17 views
13

Jak skonfigurować argparse następująco:Python argparse wymagania warunkowe

if -2 is on the command line, no other arguments are required 
if -2 is not on the command line, -3 and -4 arguments are required 

Na przykład

-2 [good] 
-3 a -4 b [good] 
-3 a [not good, -4 required] 
-2 -5 c [good] 
-2 -3 a [good] 

Istnieje szereg podobnych pytań tutaj, ale albo nie ten adres sytuacja lub nie rozumiem.

Python 2.7 jeśli to ma znaczenie.

+0

Dodać subparser wprowadzonego na -2 który replikuje inne polecenia jako opcjonalne. Na najwyższym poziomie połącz -3 i -4 razem. – Jiminion

+0

Użycie poleceń poleceń rozpoczynających się od '-' może być trudne. '-2' może działać, ale' -t' lub '--two' nie będzie, ponieważ wyglądają jak opcje. Ale jeśli '-3' jest zdefiniowany jako argument, to' -2' nie działa już jako polecenie akapert (lub wybór). – hpaulj

Odpowiedz

13

Parser (jak sugerowano w komentarzach) może działać.

Inną alternatywą (od mutually_exclusive_group nie całkiem to zrobić) jest po prostu zakodować go ręcznie, jak to było:

import argparse 

def main(): 
    parser = argparse.ArgumentParser() 

    parser.add_argument('-2', dest='two', action='store_true') 
    parser.add_argument('-3', dest='three') 
    parser.add_argument('-4', dest='four') 
    parser.add_argument('-5', dest='five') 

    args = parser.parse_args() 

    if not args.two: 
     if args.three is None or args.four is None: 
      parser.error('without -2, *both* -3 <a> *and* -4 <b> are required') 

    print args 
    return 0 

dodając trochę sterownik do tego:

import sys 
sys.exit(main()) 

i bieg ze swoimi przykładami wydaje się, że postępuje właściwie; tutaj są dwie trasy:

$ python mxgroup.py -2; echo $? 
Namespace(five=None, four=None, three=None, two=True) 
0 
$ python mxgroup.py -3 a; echo $? 
usage: mxgroup.py [-h] [-2] [-3 THREE] [-4 FOUR] [-5 FIVE] 
mxgroup.py: error: without -2, *both* -3 <a> *and* -4 <b> are required 
2 
$ 
+0

W przypadku braku lepszych alternatyw, zrobienie tego ręcznie wydaje się najlepszym kursem – foosion

+0

W http://stackoverflow.com/questions/17917265/python-argparser-for-multiple-arguments-for-partial-choices/17982009#17982009 zaproponuj dwuetapowy parsowanie. Najpierw użyj 'parse_known_args', aby sprawdzić flagę' -2', a jeśli jej nie ma, użyj innego parsera, aby wyszukać '-3' i' -4'. – hpaulj

+0

Nie sądzę, że istnieje sposób, aby wpłynąć na to, co - help wydrukuje inne niż ustawienie pomocy dla każdego argumentu ... – Leonid

1

myślę, że to jest dość trudne do osiągnięcia, że ​​(w tym ładnym komunikat pomocy), a jedynie za pomocą standardowych funkcji argparse. Możesz jednak łatwo przetestować go samodzielnie po analizie argumentów. Możesz opisać dodatkowe wymagania w epilogu. Zauważ, że nietypowe jest używanie liczb jako opcji, musiałem użyć dest = 'dwa', ponieważ arguments.2 nie jest prawidłową składnią.

#!/usr/bin/env python 

import argparse 

parser = argparse.ArgumentParser(
    description='bla bla', 
    epilog='Note: arguments -3 and -4 are required when -2 is missing') 

parser.add_argument('-2', dest='two', action='store_true') 
parser.add_argument('-3', dest='three') 
parser.add_argument('-4', dest='four') 
parser.add_argument('-5', dest='five') 

args = parser.parse_args() 

if not args.two and (args.three is None or args.four is None): 
    parser.error('arguments -3 and -4 are required when -2 is missing') 

print 'Good:', args 

Z tych wyników:

[~]: ./test.py -h 
usage: test.py [-h] [-2] [-3 THREE] [-4 FOUR] [-5 FIVE] 

bla bla 

optional arguments: 
    -h, --help show this help message and exit 
    -2 
    -3 THREE 
    -4 FOUR 
    -5 FIVE 

Note: arguments -3 and -4 are required when -2 is missing 

[~]: ./test.py -2 
Good: Namespace(five=None, four=None, three=None, two=True) 
[~]: ./test.py -3 a -4 b 
Good: Namespace(five=None, four='b', three='a', two=False) 
[~]: ./test.py -3 a 
usage: test.py [-h] [-2] [-3 THREE] [-4 FOUR] [-5 FIVE] 
test.py: error: arguments -3 and -4 are required when -2 is missing 
[~]: ./test.py -2 -5 c 
Good: Namespace(five='c', four=None, three=None, two=True) 
[~]: ./test.py -2 -3 a 
Good: Namespace(five=None, four=None, three='a', two=True) 
+0

Chociaż 'args.2' nie działa,' getattr (args, '2') 'robi. Argumenty takie jak "-2" są dozwolone, ale dodają niepotrzebne komplikacje. – hpaulj

Powiązane problemy