2013-05-27 31 views
7

Tôi đang cố gắng để có một nhóm loại trừ lẫn nhau giữa các nhóm khác nhau: Tôi có đối số -a, -b, -c và tôi muốn có xung đột với -a và -b cùng nhau , hoặc -a và -c cùng nhau. Sự giúp đỡ sẽ hiển thị một cái gì đó như [-a | ([-b] [-c])].Sử dụng loại trừ lẫn nhau giữa các nhóm

Các mã sau đây dường như không có các tùy chọn loại trừ lẫn nhau:

import argparse 
parser = argparse.ArgumentParser(description='My desc') 
main_group = parser.add_mutually_exclusive_group() 
mysub_group = main_group.add_argument_group() 
main_group.add_argument("-a", dest='a', action='store_true', default=False, help='a help') 
mysub_group.add_argument("-b", dest='b', action='store_true',default=False,help='b help') 
mysub_group.add_argument("-c", dest='c', action='store_true',default=False,help='c help') 
parser.parse_args() 

Phân tích kết hợp khác nhau - tất cả các pass:

> python myscript.py -h 
usage: myscript.py [-h] [-a] [-b] [-c] 

My desc 

optional arguments: 
    -h, --help show this help message and exit 
    -a   a help 
> python myscript.py -a -c 
> python myscript.py -a -b 
> python myscript.py -b -c 

tôi đã cố gắng thay đổi mysub_groupadd_mutually_exclusive_group biến tất cả mọi thứ vào nhau độc quyền:

> python myscript.py -h 
usage: myscript.py [-h] [-a | -b | -c] 

My desc 

optional arguments: 
    -h, --help show this help message and exit 
    -a   a help 
    -b   b help 
    -c   c help 

Làm cách nào để thêm đối số cho [-a | ([-b] [-c])]?

Trả lời

1

Vì vậy, điều này đã được hỏi một số lần. Câu trả lời đơn giản là "với argparse, bạn không thể". Tuy nhiên, đó là câu trả lời đơn giản. Bạn có thể tận dụng subparsers, vì vậy:

import argparse 
parser = argparse.ArgumentParser(description='My desc') 
sub_parsers = parser.add_subparsers() 
parser_a = sub_parsers.add_parser("a", help='a help') 
parser_b = sub_parsers.add_parser("b", help='b help') 
parser_b.add_argument("-c", dest='c', action='store_true',default=False,help='c help') 
parser.parse_args() 

Sau đó, bạn nhận được:

$ python parser -h 
usage: parser [-h] {a,b} ... 

My desc 

positional arguments: 
    {a,b} 
    a   a help 
    b   b help 

optional arguments: 
    -h, --help show this help message and exit 

và:

$ python parser b -h 
usage: parser b [-h] [-c] 

optional arguments: 
    -h, --help show this help message and exit 
    -c   c help 

Nếu bạn muốn lập luận của mình như đã nêu trong câu hỏi, có một nhìn vào docopt, nó trông đáng yêu, và nên làm chính xác những gì bạn muốn.

+0

Không hoàn toàn những gì tôi muốn, vì nó không mang lại cho tôi tùy chọn chỉ có -c (không có b). – itzhaki

+0

Đó là sự thật, lời xin lỗi của tôi. Tôi không nghĩ rằng bạn có thể có được chính xác những gì bạn muốn với argparse, nhưng tôi vẫn nghĩ docopt là một lựa chọn tốt, bạn chỉ cần thêm cách sử dụng: myscript.py [-h | -a | [-b -c]] vào chuỗi tài liệu của bạn và nó sẽ hoạt động mọi thứ cho bạn –

0

argument_groups không ảnh hưởng đến việc phân tích cú pháp. Họ chỉ đóng góp vào định dạng trợ giúp. Vì vậy, việc xác định một nhóm trong một mutually_exclusive_group không giúp được gì với vấn đề này.

Có một bản vá đề xuất, http://bugs.python.org/issue10984, 'argparse add_mutually_exclusive_group should accept existing arguments to register conflicts', mà sẽ cho phép bạn xác định hai mutually_exclusive_groups, một [-a | -b][-a | -c] khác. Tạo nhóm thứ 2 bao gồm một đối số (-a) đã được xác định là phần tầm thường của bản vá này. Việc sản xuất một dòng sử dụng có ý nghĩa khó hơn và yêu cầu viết lại một số phương thức HelpFormatter.

import argparse 
parser = argparse.ArgumentParser(description='My desc') 
group1 = parser.add_mutually_exclusive_group() 
action_a = group1.add_argument("-a", dest='a', action='store_true', default=False, help='a help') 
group1.add_argument("-b", dest='b', action='store_true',default=False,help='b help') 

group2 = parser.add_mutually_exclusive_group() 
group2.add_argument("-c", dest='c', action='store_true',default=False,help='c help') 
group2._group_actions.append(action_a) # THE KLUDGE 

print parser.format_usage() 
# usage: stack16769409.py [-h] [-a | -b] [-c] 

args = parser.parse_args() 

Usage không hiển thị chính xác 2 nhóm. Nhưng nó chấp nhận -b -c, trong khi phản đối -a -b-a -c. Nhưng bạn có thể viết một dòng sử dụng tùy chỉnh.

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