EDIT: Non importa. Perché argparse
rende l'orribile scelta di dover creare un'opzione quando si richiama group.add_argument
. Questa non sarebbe la mia scelta di design. Se siete disperati per questa funzione, si può provare a farlo con ConflictsOptionParser:
# exclusivegroups.py
import conflictsparse
parser = conflictsparse.ConflictsOptionParser()
a_opt = parser.add_option('-a')
b_opt = parser.add_option('-b')
c_opt = parser.add_option('-c')
d_opt = parser.add_option('-d')
import itertools
compatible_opts1 = (a_opt, b_opt)
compatible_opts2 = (c_opt, d_opt)
exclusives = itertools.product(compatible_opts1, compatible_opts2)
for exclusive_grp in exclusives:
parser.register_conflict(exclusive_grp)
opts, args = parser.parse_args()
print "opts: ", opts
print "args: ", args
Così, quando invochiamo esso, possiamo vedere si ottiene l'effetto desiderato.
$ python exclusivegroups.py -a 1 -b 2
opts: {'a': '1', 'c': None, 'b': '2', 'd': None}
args: []
$ python exclusivegroups.py -c 3 -d 2
opts: {'a': None, 'c': '3', 'b': None, 'd': '2'}
args: []
$ python exclusivegroups.py -a 1 -b 2 -c 3
Usage: exclusivegroups.py [options]
exclusivegroups.py: error: -b, -c are incompatible options.
Il messaggio di avviso non informa che entrambi '-a'
e '-b'
sono incompatibili con '-c'
, comunque un messaggio di errore più appropriata potrebbe essere realizzato. Più vecchio, risposta errata di seguito.
ANZIANI EDIT:[Questa modifica è sbagliato, anche se non sarebbe solo un mondo perfetto se argparse
lavorato in questo modo?] La mia risposta precedente in realtà non era corretta, si dovrebbe essere in grado di fare questo con argparse
specificando un gruppo per opzioni mutuamente esclusive. Possiamo anche usare itertools
per generalizzare il processo. E fallo in modo che non dobbiamo digitare tutte le combinazioni in modo esplicito:
import itertools
compatible_opts1 = ('-a', '-b')
compatible_opts2 = ('-c', '-d')
exclusives = itertools.product(compatible_opts1, compatible_opts2)
for exclusive_grp in exclusives:
group = parser.add_mutually_exclusive_group()
group.add_argument(exclusive_grp[0])
group.add_argument(exclusive_grp[1])
http://bugs.python.org/issue10984 ha una patch che consente di inserire un argomento in più di un gruppo mutuamente esclusivo. Fare questo è un cambiamento facile. La produzione di un utilizzo significativo con gruppi sovrapposti è più coinvolta. – hpaulj