2013-04-07 25 views
5

Tôi biết rằng không có ý nghĩa nhiều đối số vị trí thành một nhóm loại trừ lẫn nhau vì bạn không thể nói ai là ai. Nhưng tôi cần bao gồm MỘT lý lẽ vị trí vào đó.Làm cách nào để đưa một đối số vị trí vào nhóm loại trừ lẫn nhau của argparse?

Những gì tôi cần:

$ myprogram -h 
usage: myprogram [-h] [--delete value | --update value | value] 

đâu vị trí value là hành động mặc định (loại "--bao gồm"). (myprogram không có đối số cũng phải hợp lệ).

nỗ lực đầu tiên của tôi (điều này không hoạt động):

parser = ArgumentParser() 
group = parser.add_mutually_exclusive_group() 
group.add_argument('--delete', metavar='value') 
group.add_argument('--update', metavar='value') 
group.add_argument('value') 

Là có thể?


Thứ hai nỗ lực:

parser = ArgumentParser() 
group = parser.add_mutually_exclusive_group() 
group.add_argument('--delete', action='store_true') 
group.add_argument('--update', action='store_true') 
group.add_argument('--insert', action='store_true', default=True) 
group.add_argument('value') 

Trả lời

8

Tôi muốn làm điều này hơi khác một chút:

parser = ArgumentParser() 
group = parser.add_mutually_exclusive_group() 
group.set_defaults(mode='insert') 
group.add_argument('--delete', action='store_const', dest='mode', const='delete') 
group.add_argument('--update', action='store_const', dest='mode', const='update') 
group.add_argument('--insert', action='store_const', dest='mode', const='insert') 
parser.add_argument('value', nargs='?') 
args = parser.parse_args() 

Nếu bạn thêm muốn làm program --delete (không value tùy chọn) thất bại, thêm

if args.mode != 'insert' and args.value: 
    parser.error("can't {} without a value argument".format(args.mode)) 

Lưu ý rằng điều này sẽ có nghĩa là program --insert (không có value) vẫn hoạt động. Bạn có thể tránh điều này bằng một chút nỗ lực hơn bằng cách đặt mặc định modeNone, thực hiện kiểm tra ở trên với args.mode is not None và sau đó thực hiện if args.mode is None: args.mode = 'insert' hoặc tương tự.

+0

+1 cách tiếp cận tốt – msw

3

cú pháp của bạn được mô tả rõ ràng hơn như:

myprogram {--insert|--update|--delete} value 

nơi --insert giá trị mặc định là True và giá trị là bắt buộc.

argparse có thể làm cho bạn cảm thấy như cú pháp mong muốn của bạn phải phù hợp với mô hình của nó khi một cái gì đó giống như

if args.insert and (args.update or args.delete): 
    parser.print_help() 

là nhiều hơn nữa rõ ràng.

gia tăng để đáp ứng với bình luận:

Dưới đây là pseudo-code (có nghĩa là tôi đã không kiểm tra nó) trong đó cho thấy làm thế nào tôi sẽ thực hiện điều này:

parser.add_argument('--insert', action='store_true') 
parser.add_argument('--update', action='store_true') 
parser.add_argument('--delete', action='store_true') 
parser.add_argument('value') 
args = parser.parse_args(sys.argv) 
if ((args.insert and args.delete) or 
    (args.insert and args.update) or 
    (args.update and args.delete)): 
    # can't pick more than one, complain and quit 
elif not (args.update or args.delete): 
    # they specified no action so assume insert 
    args.insert = True 

# now one and only one of insert/update/delete is 
# True and args.value contains the argument 

Tôi hy vọng rằng làm cho mọi thứ rõ ràng hơn.

+0

Cám ơn câu trả lời của bạn, nhưng tôi không hoàn toàn hiểu được bạn: Tôi đã thêm ' đối số --insert 'và đặt mặc định là True. Vì vậy, phần này đã làm việc.Nhưng gọi 'myprogram' mà không có đối số thất bại vì' giá trị' là bắt buộc. Có lẽ tôi không hiểu bạn chút nào ... – borges

+0

Vui lòng cập nhật câu hỏi của bạn bằng mã mới hoặc mở một câu hỏi mới vì tôi không thể đọc những gì tôi không thể nhìn thấy. Tôi nghi ngờ rằng bạn đã cố gắng giữ cho mutually_exclusive_group không cần thiết. – msw

+0

Tôi đã cập nhật câu hỏi. – borges

3

Hãy đối số vị trí tùy chọn

parser = ArgumentParser() 
group = parser.add_mutually_exclusive_group() 
group.add_argument('--delete', metavar='value') 
group.add_argument('--update', metavar='value') 
group.add_argument('value', nargs='?') 

sử dụng là sau đó (với '?'):

usage: ipython [-h] [--delete value | --update value | value] 
Các vấn đề liên quan