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.
Hai considerato semplicemente il controllo dopo argparse con un if? – erikbwork
Potrei, la cosa bella di argparse è che gestisce il messaggio di errore per te. –
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