2016-08-23 5 views
0

私はコマンドライン引数を解析するためにargparseパッケージを使用しています。今度は、正確に0,1または2の文字列を受け取り、それらをリストに入れたいと思います。正確に0,1または2の位置引数を受け入れる

私の現在のアプローチは次のようになります。第一の場合

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument('strs', nargs='*') 

print(parser.parse_args([]).strs) 
print(parser.parse_args(['AAA']).strs) 
print(parser.parse_args(['AAA', 'BBB']).strs) 
print(parser.parse_args(['AAA', 'BBB', 'CCC']).strs) 

parse_args() 2番目と3番目の結果が期待されています。最後の1つは、私の現在のアプローチはif len(parse_args.strs) > 2: raiseです。私のためにargparseチェックをさせる可能性のあるより良いアプローチはありますか? nargsの範囲を受け入れるように​​内の手段がありません

+0

その複製の答えは私が提案したようなカスタムのActionクラスを与えます。しかし、それはポスト・パース・テストよりも改善されているとは思えません。 – hpaulj

答えて

1

、ちょうど12'+''*'ような値。

が渡す値の数をチェックするカスタムActionクラスを書くことができます。しかし、私は解析した後にそのテストを実行するのと同じくらい簡単だと思います。

本当にそのことを知りたい場合は、範囲nargsを追加することを検討するバグや問題が見つかりました。

あなたが他のポジションを持っていなかった場合は、3ポジションを定義することができます.2つは?です。共通名と「追加」アクションを使用してそれらを1つのリストに結合することさえできます。私はそれを探検します。

In [573]: p=argparse.ArgumentParser() 
In [574]: p.add_argument('str',action='append') 
In [575]: p.add_argument('str',nargs='?',action='append') 
In [576]: p.add_argument('str',nargs='?',action='append') 

In [577]: p.print_help() 
usage: ipython3 [-h] str [str] [str] 

positional arguments: 
    str 
    str 
    str 

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

In [578]: p.parse_args('1 2 3'.split()) 
Out[578]: Namespace(str=['1', '2', '3']) 
In [579]: p.parse_args('1 3'.split()) 
Out[579]: Namespace(str=['1', '3', None]) 
In [580]: p.parse_args('1'.split()) 
Out[580]: Namespace(str=['1', None, None]) 

Not Nonesを取得しました。私は

p.add_argument('str', nargs='?', action='append', default=argparse.SUPPRESS) 

In [586]: p.parse_args('1 2'.split()) 
Out[586]: Namespace(str=['1', '2']) 
In [588]: p.parse_args('1 2 3 4'.split()) 
usage: ipython3 [-h] str [str] [str] 
ipython3: error: unrecognized arguments: 4 

で(おっと、これは1-3引数にコーディングされているが、あなたのアイデアを得る)ことを修正することができます。

+0

私はあなたがこのオープンな問題を参照していると信じています:http://bugs.python.org/issue11354。 –

+0

はい、部分的に対処された問題の大きなバックログがあります。これは優先度の低い拡張です。それは、構文解析コード自体よりもヘルプと使用フォーマットの変更が大きく必要です。 – hpaulj

関連する問題