は、ここで私が開始するには、合理的な場所であるかもしれない一緒に入れ、簡単なハックです:
import argparse
class PositionalAction(argparse.Action):
def __call__(self,parser,namespace,values,option_string=None):
lst = getattr(namespace,self.dest)
lst.append(values)
parser.last_positional_values = lst
all_positional = getattr(namespace,'all_positional',[])
all_positional.append(lst)
namespace.all_positional = all_positional
class AssociateAction(argparse.Action):
def __call__(self,parser,namespace,values,option_string=None):
try:
parser.last_positional_values.append(values)
except AttributeError:
pass
parser = argparse.ArgumentParser()
parser.add_argument('-o',action=AssociateAction,dest=argparse.SUPPRESS)
junk,unknown = parser.parse_known_args()
for i,_ in enumerate(unknown):
parser.add_argument('arg%d'%i,action=PositionalAction,default=[])
print parser.parse_args()
そして、ここではアクションである:
temp $ python test1.py foo -o 1 bar -o 2 baz qux -o 4
Namespace(all_positional=[['foo', '1'], ['bar', '2'], ['baz'], ['qux', '4']], arg0=['foo', '1'], arg1=['bar', '2'], arg2=['baz'], arg3=['qux', '4'])
この問題は、いくつかの課題があります。まず、任意の数の定位置引数を受け取りたい - argparseはそれを好まない。 argparseは何を期待するべきかを知りたい。解決策はパーサーを構築してコマンドラインを解析することですが、argparseには既知の引数だけを解析するように指示します(この場合は、非位置の-o
引数はすべて解析されますが、 "位置"引数は解析されません)。 。 parse_known_args
は、(namespace_of_parsed_stuff, uknown_args)
という形式のタプルを返すので、これには最適です。だから、未知の議論を知っている - parse_argsを幸せにするために、パーザに位置引数を追加するだけでよい。
さて、カスタムアクションは実際に何をしていますか?位置引数が見つかると(2回目のパスで)、デフォルト(リスト)が取得され、そのリストに値が追加されます(以降、値リストと呼びます)。 パーサーを「値」リストを参照して変更します。また、名前空間から "all_positional"リストを取得します。その属性がない場合は、空のリストを取得するだけです。 "value"リストを "all_positional"リストに追加し、名前空間に戻します。
フラグが-o
になると、パーサーが「値」リストを取得し、そのリストに追加値が追加されます。パーサに全く触れることなく同じことをすることができます...(namespace.all_positional[-1]
- これはparser.last_positional_values
と同じリストです)。ほんの少し複雑な場合
あなたにはいくつのポジションの引数があるでしょうか? – mgilson
いいえ、私は引数の数にかかわらず引数をループしたいです。 – bkanuka