2011-12-24 21 views
14

Tiêu đề khá nhiều nói lên tất cả. Nếu tôi có nargs lớn hơn 1, có cách nào tôi có thể thiết lập các hạn chế (chẳng hạn như lựa chọn/loại) trên args cá nhân phân tích cú pháp?Loại argparse Python và hạn chế lựa chọn với nargs> 1

Đây là một số mã ví dụ:

parser = argparse.ArgumentParser() 
parser.add_argument('-c', '--credits', nargs=2, 
    help='number of credits required for a subject') 

Đối với đối số -c tôi cần phải xác định một đối tượng và có bao nhiêu tín chỉ được yêu cầu. Đối tượng nên được giới hạn trong danh sách các đối tượng được xác định trước và số lượng tín dụng bắt buộc phải là một phao.

Tôi có thể làm điều này với một subparser, nhưng vì nó là điều này đã là một phần của một lệnh phụ nên tôi không thực sự muốn mọi thứ trở nên phức tạp hơn.

Trả lời

16

Bạn có thể xác nhận nó với một custom action:

import argparse 
import collections 


class ValidateCredits(argparse.Action): 
    def __call__(self, parser, args, values, option_string=None): 
     # print '{n} {v} {o}'.format(n=args, v=values, o=option_string) 
     valid_subjects = ('foo', 'bar') 
     subject, credits = values 
     if subject not in valid_subjects: 
      raise ValueError('invalid subject {s!r}'.format(s=subject)) 
     credits = float(credits) 
     Credits = collections.namedtuple('Credits', 'subject required') 
     setattr(args, self.dest, Credits(subject, credits)) 

parser = argparse.ArgumentParser() 
parser.add_argument('-c', '--credits', nargs=2, action=ValidateCredits, 
        help='subject followed by number of credits required', 
        metavar=('SUBJECT', 'CREDITS') 
        ) 
args = parser.parse_args() 
print(args) 
print(args.credits.subject) 
print(args.credits.required) 

Ví dụ,

% test.py -c foo 2 
Namespace(credits=Credits(subject='foo', required=2.0)) 
foo 
2.0 
% test.py -c baz 2 
ValueError: invalid subject 'baz' 
% test.py -c foo bar 
ValueError: could not convert string to float: bar 
+0

+1 Tốt, tôi đã tự hỏi liệu điều này có hiệu quả không. –

+0

Cuối cùng đã có xung quanh để thực hiện điều này, và con người giải pháp của bạn là tốt. Ước gì tôi có thể cung cấp cho bạn nhiều upvotes hơn! Cảm ơn! –

+2

Lưu ý cho hậu thế: thêm 'metavar = (" SUBJECT "," CREDITS ")' vào lệnh 'add_argument' sẽ giúp hiển thị' --credits SUBJECT CREDITS' thay vì '--credits CREDITS CREDITS'. – Dougal

-2

tôi giả sử bạn có thể thử này - trong add_argument(), bạn có thể chỉ định một tập hạn chế về đầu vào có lựa chọn = 'xyz' hoặc lựa chọn = [điều này, rằng] như được mô tả tại đây: http://docs.python.org/library/argparse.html#choices

parser = argparse.ArgumentParser() 
parser.add_argument('-c', '--credits', choice='abcde', nargs=2, 
    help='number of credits required for a subject') 
Các vấn đề liên quan