Ответ 1
ИЗМЕНИТЬ: Ничего. Потому что argparse
делает ужасный выбор необходимости создания опции при вызове group.add_argument
. Это был бы не мой выбор дизайна. Если вы отчаянно нуждаетесь в этой функции, вы можете попробовать сделать это с помощью 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
Таким образом, когда мы вызываем его, мы видим, что мы получаем желаемый эффект.
$ 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.
Предупреждающее сообщение не сообщает вам, что оба '-a'
и '-b'
несовместимы с '-c'
, однако может быть создано более подходящее сообщение об ошибке. Более старый, неправильный ответ ниже.
OLDER EDIT: [Это изменение неверно, хотя это был бы просто идеальный мир, если argparse
работал таким образом?] Мой предыдущий ответ на самом деле был неправильным, вы должны быть способны сделайте это с помощью argparse
, указав одну группу на взаимоисключающие параметры. Мы можем даже использовать itertools
для обобщения процесса. И сделайте так, что нам не нужно явно вводить все комбинации:
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])