如何使python的argparse接受任意数量的[-R a b] s,并将它们聚合成一个列表

时间:2014-11-05 22:19:31

标签: python argparse

我希望能够调用foo.py -R a b -R c d -R e f并在变量中获得[('a', 'b'), ('c', 'd'), ('e', 'f')]之类的内容。我可以使用foo.py -R a=b -R c=d -R e=f并手动进行拆分,但我不想这样做,因为我正在构建另一个程序的包装器,并希望模仿它的命令行选项输入格式。

我尝试了以下内容:

#!/usr/bin/env python
import argparse
parser = argparse.ArgumentParser(description='Foo')
parser.add_argument('-R', metavar=('A', 'B'), dest='libnames', type=str, default=('.', 'Top'), nargs=2)

if __name__ == '__main__':
    args = parser.parse_args()
    print(args.libnames)

但是当我将其称为['e', 'f']时,我会得到foo.py -R a b -R c d -R e f

1 个答案:

答案 0 :(得分:2)

您可以使用自定义argparse.Action类。

https://docs.python.org/3/library/argparse.html#argparse.Action

import argparse

class Pairs(argparse.Action):
    def __call__(self, parser, namespace, values, opts, **kwargs):
        lst = getattr(namespace, self.dest)
        if lst is None:
            lst = []
            setattr(namespace, self.dest, lst)
        lst.append(tuple(values))

parser = argparse.ArgumentParser()   
parser.add_argument('-R', nargs='+', dest='libnames', action=Pairs)
print parser.parse_args("-R a b -R c d -R e f".split())

输出:

Namespace(libnames=[('a', 'b'), ('c', 'd'), ('e', 'f')])