argparse将位置参数集中到多个列表中

时间:2018-10-12 02:32:57

标签: python argparse

我希望能够支持基于先验谓词进入不同列表的位置命令行参数。

例如,如下命令:

mycommand one two three

会产生类似args的参数:

main_dest = ['one','two','three']
other_dest = []

但命令如下:

mycommand one --other two three --main four five

会产生类似args的参数:

main_dest = ['one','four','five']
other_dest = ['two','three']

从概念上讲,我想要的是一种修改位置参数阅读器的dest的动作。

1 个答案:

答案 0 :(得分:1)

第一次尝试,这套动作似乎可以解决问题:

In [73]: parser = argparse.ArgumentParser()
In [74]: parser.add_argument('main', nargs='*');
In [75]: parser.add_argument('other', nargs='*');
In [76]: parser.add_argument('--main', action='append');
In [77]: parser.add_argument('--other', action='append');

In [78]: parser.print_usage()
usage: ipython3 [-h] [--main MAIN] [--other OTHER]
                [main [main ...]] [other [other ...]]

In [79]: parser.parse_args('one two three'.split())
Out[79]: Namespace(main=['one', 'two', 'three'], other=[])

In [80]: parser.parse_args('one --other two --main three'.split())
Out[80]: Namespace(main=['one', 'three'], other=['two'])

74和76都将main作为其dest。我将append用于标记的那些,这样它们就不会覆盖位置值。但是,尽管usage显示了什么,但是位置仅在开始时起作用。如果放在末尾,它们将覆盖标记的值。而且“其他”位置永远不会获得值-因此我应该省略它。

因此可以玩这样的游戏,但我不确定它是否可靠,或者对您的用户来说更简单。

argparse: flatten the result of action='append'