2013-02-04 152 views
15

カンマで区切られた整数のリストを含む必須の位置引数を解析したいと思います。最初の整数は、先頭にマイナス(「 - 」)が含まれている場合、符号を、argparseは文句:argparseを使用して負の符号(負の数)で位置引数を解析する方法

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument('positional') 
parser.add_argument('-t', '--test', action='store_true') 
opts = parser.parse_args() 
print opts 

$ python example.py --test 1,2,3,4 
Namespace(positional='1,2,3,4', test=True) 

$ python example.py --test -1,2,3,4 
usage: example.py [-h] [-t] positional 
example.py: error: too few arguments 

$ python example.py --test "-1,2,3,4" 
usage: example.py [-h] [-t] positional 
example.py: error: too few arguments 

私は人々がフラグ文字として-以外の他の文字を使用することをお勧め見てきましたが、私はむしろ、ということをしないだろう。 --test-1,2,3,4の両方を有効な引数として許可するようにargparseを構成する別の方法はありますか?

+2

は、あなたが行うことができます: 'のpython example.py --test = -1,2,3,4' – lababidi

答えて

21

あなたはあなたのコマンドライン引数に--を挿入する必要があります。

$ python example.py --test -- -1,2,3,4 
Namespace(positional='-1,2,3,4', test=True) 

ダブルダッシュargparse任意の複数のオプションのスイッチを探して停止します。これは、コマンドラインツールのこのユースケースを正確に扱う標準的な方法です。 documentationから

+0

ああ、私は「標準の知りませんでした'二重ダッシュを使用する必要があるの(まだ学んでいます、まだ学んでいます...)情報をありがとう! – Inactivist

+1

これはちょうど私に 'error:unrecognized arguments:--'(Python 2.7.3ではargparse)を与えます。 – panzi

+1

@panzi:Python 2.7.5ではこのような問題はありません。 –

8

The parse_args() method attempts to give errors whenever the user has clearly made a mistake, but some situations are inherently ambiguous. For example, the command-line argument -1 could either be an attempt to specify an option or an attempt to provide a positional argument. The parse_args() method is cautious here: positional arguments may only begin with - if they look like negative numbers and there are no options in the parser that look like negative numbers:

-1,2,3,4ので、あなたは、ほとんどの* nixシステムのように--でそれを「エスケープ」しなければならない負の数のようなない外観を行います。

他の解決策は、位置のためnargsを使用することで、スペースを区切りとして数字を渡します

#test.py 
import argparse 

parser = argparse.ArgumentParser() 
parser.add_argument('positional', nargs='*') #'+' for one or more numbers 

print parser.parse_args() 

出力:

$ python test.py -1 2 3 -4 5 6 
Namespace(positional=['-1', '2', '3', '-4', '5', '6']) 

あなたが欲しいものを得るための第三の方法は、使用することですparse_argsの代わりにparse_known_argsです。 あなたがパーサーに位置引数を追加し、代わりにそれを手動で解析されません。

import argparse 

parser = argparse.ArgumentParser() 
parser.add_argument('--test', action='store_true') 

parsed, args = parser.parse_known_args() 
print parsed 
print args 

結果:

$ python test.py --test -1,2,3,4            
Namespace(test=True) 
['-1,2,3,4']  

これは、ヘルプテキストはあまり有益になるという欠点があります。 --test引数を取った場合、誰がこれを必要とする念の

+0

私はドキュメントを見ましたが、標準的な動作を変更するトリックがあるかどうか疑問に思っていました。この時点では、 ' - 'エスケープメカニズムを使うよりも4つの独立した位置引数を使うことやスペース区切り文字を使う方が良いと思います。助けてくれてありがとう。 – Inactivist

+0

@Inactivist「-1,2,3,4」スタイルの位置を可能にする第3の方法で私の答えを更新しました。 – Bakuriu

関連する問題