2012-12-17 38 views
14

Tôi muốn thực hiện logic như thế này trong argparse:Python argparse: lẫn nhau nhóm độc quyền với một số đối số tương thích

If argument A is selected, the user cannot select arguments B or C. 
B and C can both be selected 

Dường như add_mutually_exclusive_group là những gì tôi muốn cho điều này, nhưng có vẻ như bạn chỉ có thể chọn một tùy chọn từ một nhóm loại trừ lẫn nhau, vì vậy tôi không thể đưa cả ba vào một nhóm loại trừ lẫn nhau.

Có cách nào để làm điều này trong argparse?

+0

Bạn có xem xét đơn giản là kiểm tra sau khi argparse nếu có? – erikbwork

+2

Tôi có thể, điều tốt đẹp về argparse là nó xử lý thông báo lỗi cho bạn. –

+0

Mặc dù bạn có thể thêm một nhóm các tùy chọn thông thường bằng cách sử dụng 'add_argument_group' vào nhóm loại trừ lẫn nhau, nhưng điều này không có tác dụng gì cả (giống như không có một nhóm độc quyền lẫn nhau). Có lẽ lựa chọn tốt hơn bạn có là viết một hành động tùy chỉnh thực hiện loại logic này. Nó sẽ là quá khó để làm. – Bakuriu

Trả lời

-1

Bạn có thể phủ nhận ý nghĩa của A và sau đó sử dụng một subparser. Các subparsers cho phép bạn chỉ định rằng "Nếu và chỉ khi A được chọn, người dùng có thể chọn B hoặc C."

http://docs.python.org/2/library/argparse.html

+3

Đây là một câu trả lời thực sự xấu mà không có một ví dụ. – Oz123

2

Bạn có thể không thực sự làm điều đó với argparse, tuy nhiên bạn có thể làm điều đó sau khi argparse đã chạy.

Dưới đây là một ví dụ:

parser = argparse.ArgumentParser() 

# group 1 
parser.add_argument("-q", "--query", help="query", required=False) 
parser.add_argument("-f", "--fields", help="field names", required=False) 

# group 2 
parser.add_argument("-a", "--aggregation", help="aggregation", 
        required=False) 

Tôi đang sử dụng ở đây tùy chọn cho một dòng wrapper lệnh cho các truy vấn một MongoDB. Ví dụ collection có thể gọi phương thức aggregate hoặc phương pháp find với đối số tùy chọn queryfields, do đó bạn thấy lý do hai đối số đầu tiên tương thích và đối số cuối cùng không phải là.

Vì vậy, bây giờ tôi chạy parser.parse_args() và kiểm tra nội dung của nó:

args = parser().parse_args() 

print args.aggregation 
if args.aggregation and (args.query or args.fields): 
    print "-a and -q|-f are mutually exclusive ..." 
    sys.exit(2) 

Tất nhiên, ít hack này chỉ làm việc đối với trường hợp đơn giản và nó sẽ trở thành một cơn ác mộng để rà soát tất cả các tùy chọn có thể nếu bạn có nhiều lẫn nhau các tùy chọn và nhóm độc quyền. Trong trường hợp đó, bạn nên chia các tùy chọn của mình thành nhóm lệnh. Để làm được điều đó, bạn nên làm theo gợi ý ở đây Python argparse mutual exclusive group.

1

Docopt có thể hoạt động trong trường hợp này.

Nó sử dụng đường ống cho các yếu tố loại trừ lẫn nhau.

my_program (aggregate | find [-q | -f]) 
+0

Nếu bạn không phải sử dụng argparse để phù hợp với nhóm của bạn, hãy sử dụng Docopt. Nếu bạn phải sử dụng argparse, sau đó nói chuyện với người có thể quyết định khác nhau, và cho họ thấy Docopt. Docopt làm cho nó nhanh chóng, và siêu dễ dàng để thiết lập các yêu cầu phức tạp và hành vi, bởi vì argparse và nó là ilk, về cơ bản là đuôi vẫy con chó. Tôi đã không tìm thấy một trường hợp duy nhất mà tôi không thể làm một cái gì đó tôi thực sự cần thiết trong Docopt, mà tôi có thể làm (và sẽ làm việc) trong argparse. – TinBane

Các vấn đề liên quan