位置引数を、それらが発生したときに存在する「引数の状態」に関連付けたいと思います。たとえば、次のコマンド ラインです。
script.py -m 1 foo -r 2 bar -r 7 baz -m 6 quux
次の関連付けを生成する必要があります。
foo: m=1, r=0 (default value for r)
bar: m=1, r=2
baz: m=1, r=7
quux: m=6, r=7
argparse
これはモジュールで実行できますか?
sys.argv
これは役に立たないかもしれませんが、この問題は、いくつかの断片に分割できれば、最も簡単に解決できるようです。あなたが言うように、それらはどこでも発生する可能性があるため)、どの部分が何らかの議論になるはずなのか. 以下の例では、あなたの例で動作するように設定しましたがsys.argv
、ファイルまたは特定の種類のファイルで簡単に分割できます。関数はあなたcondition
次第です。残りは(うまくいけば)一目瞭然です。
import argparse
import sys
import copy
import os
def split_list(lst,condition):
current=[]
out=[current]
for arg in lst:
current.append(arg)
if(condition(arg)):
current=[]
out.append(current)
return out
parser=argparse.ArgumentParser()
parser.add_argument('-m',action='store')
parser.add_argument('-r',default='0',action='store')
#pieces=split_list(sys.argv[1:],os.path.isfile)
pieces=split_list(sys.argv[1:],lambda x: x in ('foo','bar','baz','quux'))
options={} #use collections.OrderedDict if order matters -- or some more suitable data structure.
default=argparse.Namespace()
for args in pieces:
if(not args):
continue
ns=copy.deepcopy(default)
default=parser.parse_args(args[:-1],namespace=ns)
options[args[-1]]=default
print (options)