2012-12-17 3 views
14

vorrei implementare la logica come questo in argparse:Python argparse: Mutually gruppo esclusivo con alcuni argomenti compatibili

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

Sembra add_mutually_exclusive_group è quello che vorrei per questo, ma sembra che solo si può scegli un'opzione da un gruppo mutuamente esclusivo, quindi non posso mettere tutti e tre in un gruppo mutuamente esclusivo.

C'è un modo per farlo in argparse?

+0

Hai considerato semplicemente il controllo dopo argparse con un if? – erikbwork

+2

Potrei, la cosa bella di argparse è che gestisce il messaggio di errore per te. –

+0

Tuttavia, potrei aggiungere un gruppo normale di opzioni usando 'add_argument_group' al gruppo mutuamente esclusivo, ma questo non funziona affatto (è come se non avessi un gruppo che si escludesse a vicenda). Probabilmente la scelta migliore è quella di scrivere un'azione personalizzata che implementa questo tipo di logica. Dovrebbe essere troppo difficile da fare. – Bakuriu

risposta

-1

È possibile negare il significato di A e quindi utilizzare un subparatore. La sottospecifica consente di specificare che "Se e solo se A è selezionato, l'utente può selezionare B o C."

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

+3

Questa è una risposta davvero brutta senza un esempio. – Oz123

2

non si poteva davvero farlo con argparse, ma è possibile farlo dopo argparse s'è.

Ecco un esempio:

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) 

sto usando qui opzioni fornite ad una linea di involucro di comando per interrogare un MongoDB. L'istanza collection può chiamare il metodo o il metodo find con gli argomenti facoltativi query e fields, quindi si vede perché i primi due argomenti sono compatibili e l'ultimo non lo è.

Così ora corro parser.parse_args() e controllare il suo contenuto:

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) 

Naturalmente, questo piccolo hack funziona solo per i casi semplici e sarebbe diventato un incubo per controllare tutte le possibili opzioni, se si dispone di molti reciprocamente opzioni e gruppi esclusivi. In tal caso dovresti suddividere le tue opzioni in gruppi di comando. Per questo, dovresti seguire il suggerimento qui Python argparse mutual exclusive group.

1

Docopt potrebbe funzionare in questo caso.

Utilizza i tubi per elementi mutuamente esclusivi.

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

Se non si deve usare argparse per coerenza con il proprio team, utilizzare Docopt. Se devi usare argparse, parla con la persona che può decidere diversamente e mostra loro Docopt. Docopt lo rende veloce e facile da configurare con complicati requisiti e comportamenti, perché argparse ed è ilk, sono fondamentalmente la coda che scuote il cane. Non ho trovato una singola istanza in cui non potrei fare qualcosa di cui avevo effettivamente bisogno in Docopt, che avrei potuto fare (e avrebbe funzionato) in argparse. – TinBane