EDIT:決して気にしないでください。は、group.add_argument
を呼び出すときにオプションを作成するという恐ろしい選択をするためです。それは私のデザインの選択肢ではありません。したがって
# 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
を、我々はそれを呼び出すとき、我々は所望の効果を得る見ることができます:あなたはこの機能のために必死にしている場合は、ConflictsOptionParserでそれをやってみることができます。
$ 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:[がこのように働いていた場合、それだけで完璧な世界ではないでしょうが、この編集は、間違っている?]、あなたはでこれを行うことができるはず私の前の回答は、実際には間違っていました相互に排他的なオプションごとに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])
http://bugs.python.org/issue10984には、複数の相互排他的なグループに引数を付けるパッチがあります。そうすることは簡単な変更です。グループが重複している意味のある使い方を作ることは、より複雑です。 – hpaulj