2013-08-02 17 views
13

Come faccio a impostare argparse come segue:Python argparse requisiti condizionali

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 

Per esempio,

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

Ci sono una serie di domande simili qui, ma o non affrontano questo situazione o non capisco.

Python 2.7 se questo è importante.

+0

Fai un subparser calettato su -2 che replica gli altri comandi come optional. Al livello più alto, link -3 e -4 insieme. – Jiminion

+0

L'uso dei comandi della sottospecifica che iniziano con '-' può essere complicato. '-2' potrebbe funzionare, ma' -t' o '--two' non lo farebbero perché sembrano opzionali. Ma se '-3' è definito come argomento, allora' -2' non funziona più come un comando subparser (o una scelta). – hpaulj

risposta

13

Un subparser (come suggerito nei commenti) potrebbe funzionare.

Un'altra alternativa (poiché mutually_exclusive_group non riesco farlo) è solo codificare manualmente, per così dire:

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 

Aggiungendo un po conducente di questo:

import sys 
sys.exit(main()) 

e run con i tuoi esempi, sembra fare la cosa giusta; qui ci sono due piste:

$ 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

In assenza di alternative migliori, farlo manualmente sembra il miglior corso – foosion

+0

In http://stackoverflow.com/questions/17917265/python-argparser-for-multiple-arguments-for-partial-choices/17982009#17982009 I suggerire un analisi in due passaggi. Per prima cosa usa 'parse_known_args' per controllare il flag' -2', e se questo è mancante, usa un altro parser per cercare '-3' e' -4'. – hpaulj

+0

Non credo che ci sia un modo per influenzare ciò che --help stamperà oltre all'impostazione di help per ogni argomento ... – Leonid

1

penso che è abbastanza difficile da raggiungere che (tra cui un bel messaggio di aiuto), mentre solo utilizzando le funzioni argparse standard. Puoi comunque testarlo da solo dopo aver analizzato gli argomenti. Puoi descrivere i requisiti aggiuntivi nell'epilogo o giù di lì. Si noti che è inusuale usare i numeri come opzioni, ho dovuto usare dest = 'two', poiché args.2 non è una sintassi valida.

#!/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 

Con questi risultati:

[~]: ./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

Mentre 'args.2' non funziona,' getattr (args, '2') 'fa. Argomenti come '-2' sono consentiti, ma aggiungono complicazioni inutili. – hpaulj

Problemi correlati