可以使用命名参数argparse关联位置参数吗?

时间:2012-06-30 18:17:58

标签: python argparse

我想将位置参数与发生时存在的“参数状态”联系起来。例如,以下命令行:

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模块吗?

1 个答案:

答案 0 :(得分:1)

这可能对你没用,但如果你可以将sys.argv分成几部分,这个问题似乎最简单 - 基本上,你需要能够弄清楚哪些部分应该是“位置”的参数(它们实际上不是位置,因为正如你所说,它们可以在任何地方出现)以及哪些部分应该是某种参数。在下面的示例中,我将其设置为与您的示例一起使用,但您可以轻松地在文件上或在某种文件上分割sys.argvcondition功能取决于您编写。其余的(希望)是不言自明的。

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)