2011-12-24 5 views
14

タイトルはほとんどすべてを言います。もしnargsが1より大きければ、解析された個々のargsに制限(選択/タイプなど)を設定する方法はありますか?Pythonのargparse型とnargsでの選択の制限> 1

これは、いくつかのサンプルコードです:私は、被写体とどのように多くのクレジットが必要とされているを指定する必要が-c引数に

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

。サブジェクトは事前定義されたサブジェクトのリストに限定され、必要なクレジット数はフロートでなければなりません。

これはおそらくサブパーザで行うことができますが、これはすでにサブコマンドの一部なので、私は実際にはもっと複雑になることは望んでいません。 add_argumentに()、あなたは、限られたセットを指定することができます -

答えて

16

あなたは私はあなたがこれを試みることができると仮定し、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) 
例えば

% 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これはうまくいきましたか? –

+0

最後に、これを実装することに成功しました。あなたのソリューションは良いです。私はあなたにもっとアップホントを与えることができれば願っています!ありがとう! –

+2

後書きについて: 'metavar =(" SUBJECT "、" CREDITS ")'を 'add_argument'呼び出しに追加すると、' --credits CREDITS CREDITS'ではなく '--credits SUBJECT CREDITS'が表示されます。 – Dougal

-2

それを検証することができますchoice = 'xyz'またはchoice = [this、that]ここに記載されているような の入力: 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')