EDIT: Không sao. Bởi vì argparse
làm cho sự lựa chọn khủng khiếp của việc phải tạo ra một tùy chọn khi gọi group.add_argument
. Đó sẽ không phải là lựa chọn thiết kế của tôi. Nếu bạn đang tuyệt vọng cho tính năng này, bạn có thể thử làm việc đó với 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
Vì vậy khi chúng ta gọi nó, chúng ta có thể thấy chúng tôi nhận được hiệu quả mong muốn.
$ 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.
Thông điệp cảnh báo không thông báo cho bạn rằng cả hai '-a'
và '-b'
không phù hợp với '-c'
, tuy nhiên một thông báo lỗi thích hợp hơn có thể được chế tác. Câu trả lời sai, cũ hơn bên dưới. EDIT
TRỞ LÊN:[chỉnh sửa này là sai, mặc dù nó sẽ không chỉ là một thế giới hoàn hảo nếu argparse
làm việc theo cách này?] câu trả lời trước đây của tôi thực sự là không chính xác, bạn sẽ có thể làm điều này với argparse
bằng cách chỉ định một nhóm cho mỗi tùy chọn loại trừ lẫn nhau. Chúng tôi thậm chí có thể sử dụng itertools
để tổng quát hóa quy trình. Và làm cho nó để chúng tôi không phải loại ra tất cả các kết hợp một cách rõ ràng:
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 có bản vá cho phép bạn đặt một đối số vào nhiều nhóm loại trừ lẫn nhau. Làm điều đó là một sự thay đổi dễ dàng. Việc sử dụng có ý nghĩa với các nhóm chồng chéo có liên quan nhiều hơn. – hpaulj