編集:気にしないでください。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
以前の答えは実際には正しくありませんでしたが、相互に排他的なオプションごとに1つのグループを指定することでこれを行うことができます。プロセスを一般化するために使用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])