РЕДАКТИРОВАТЬ : Неважно. Потому что 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'
, однако может быть создано более подходящее сообщение об ошибке. Старый, неправильный ответ ниже.
ПОСЛЕДНЕЕ РЕДАКТИРОВАНИЕ: [Это редактирование неверно, хотя не будет ли это просто идеальный мир, если 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])