[英]Make Python's argparse accept single-character abbreviations for subparsers?
[英]How can I make python's argparse accept any number of [-R a b]s, and aggregate them into a list
我希望能夠調用foo.py -R ab -R cd -R ef
並得到類似[('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)
但是當我將其foo.py -R ab -R cd -R ef
為foo.py -R ab -R cd -R ef
時['e', 'f']
我得到了['e', 'f']
。
您可以使用自定義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')])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.