3

引数パーサーを次のように設定しました。

parser=argparse.ArgumentParser()
parser.add_argument('--point',help='enter a point (e.g. 2,3,4)')
parser.parse_args('--point=-2,5,6'.split())  #works
parser.parse_args('--point -2,5,6'.split())  #doesn't work :(

正規表現に一致する文字列がr"-\d+.*"オプションではなく、オプションの引数であることをargparseに伝える方法はありますか?

また、私はこのようなことをすることができることに注意してください:

parser.add_argument('--point',nargs='*')
parser.parse_args('--point -2 5 6'.split())

しかし、それは私が実際にそれを機能させたい方法ではありません。

4

3 に答える 3

3

ここでは、sys.argvの前処理が最も簡単な方法だと思います。たとえば、次のことを考慮してください。

import argparse, re

parser=argparse.ArgumentParser()
parser.add_argument('--point',help='enter a point (e.g. 2,3,4)')

args = '--point -2,5,6'.split() # or sys.argv

is_list = re.compile(r'^-?[\d,.]+$')
args = ['"%s"' % x if is_list.match(x) else x for x in args]
print parser.parse_args(args)

これによりNamespace(point='"-2,5,6"')、解析が容易なはずの戻り値が返されます。

于 2012-06-14T14:18:47.060 に答える
1

プレフィックス charを変更して-、引数の開始を示すものとして認識されないようにすることができます。少し奇妙に見えますが、引数に負の数が現れる可能性がある場合に便利です。

import argparse
parser=argparse.ArgumentParser(prefix_chars = '@')
parser.add_argument('@@point',help='enter a point (e.g. 2,3,4)')
args = parser.parse_args('@@point=-2,5,6'.split())  #works
print(args)
# Namespace(point='-2,5,6')

args = parser.parse_args('@@point -2,5,6'.split())  #work also
print(args)
# Namespace(point='-2,5,6')
于 2012-06-13T21:41:34.277 に答える
1

argparse の内部をいじっても構わないのであれば、argparse は既に私がやりたいことと非常によく似た機能を持っています。ArgumentParserから継承するクラスの1つにこの行があります__init__

import re as _re
...
self._negative_number_matcher = _re.compile(r'^-\d+$|^-\d*\.\d+$')

したがって、私の例を機能させるには、適切な正規表現を交換する必要があります...

parser._negative_number_matcher = re.compile(r'^-\d+|^-\d*\.\d+')

通常、アンダースコアが前に付いているクラスの内部をいじることにはあまり賛成しません(実装に依存し、変更される可能性があるため)-ただし、この場合、おそらく問題ないと思いますなぜなら:

  • argparse がその変数名を変更しても問題はありません。「--print -2,3,4」が再び機能しないケースに戻るだけです。
  • 何かが数値であるかどうかを正規表現よりも判断するためのより良い方法は考えられません (float にキャストして例外をキャッチしようとすることができると思いますが、それを行った場合、_negative_number_matcher という名前の変数はもうありません)繰り返しますが、argparse は、私が望むことをしないこのコーナーケースを除いて、引き続き正常に動作します)
于 2012-06-14T13:16:58.010 に答える