我想将位置参数与它们发生时存在的“参数状态”相关联。例如,以下命令行:
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)