수정 : 신경 쓰지 마세요. argparse
은 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 편집 :[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])
http://bugs.python.org/issue10984에는 둘 이상의 상호 배타적 인 그룹에 인수를 넣을 수있는 패치가 있습니다. 그렇게하는 것은 쉬운 변화입니다. 그룹이 겹치는 의미있는 사용법이 더 복잡합니다. – hpaulj