我希望将一个必需的命令行参数作为位置参数或可选参数传递。例如,我希望从以下任何调用执行相同的操作:
prog 10
prog -10
prog -n 10
prog --num 10
argparse可以吗?
答案 0 :(得分:0)
通过互斥组,我可以创建一个合理的近似值:
在互动环节中:
In [10]: parser=argparse.ArgumentParser()
In [11]: grp=parser.add_mutually_exclusive_group(required=True)
In [12]: a=grp.add_argument('pos',nargs='?',type=int,default=0)
In [13]: b=grp.add_argument('-n','--num')
grp
可以包含任意数量的可选项和一个可选位置。我为位置选择了不同的type
只是突出差异。
只是位置值:
In [14]: parser.parse_args(['10'])
Out[14]: Namespace(num=None, pos=10)
可选的各种形式:
In [16]: parser.parse_args(['-n10'])
Out[16]: Namespace(num='10', pos=0)
In [17]: parser.parse_args(['--num=10'])
Out[17]: Namespace(num='10', pos=0)
In [18]: parser.parse_args(['--num','10'])
Out[18]: Namespace(num='10', pos=0)
测试群体排他性
In [25]: parser.parse_args(['--num=20','10'])
usage: ipython3 [-h] [-n NUM] [pos]
ipython3: error: argument pos: not allowed with argument -n/--num
和所需的小组:
In [26]: parser.parse_args([])
usage: ipython3 [-h] [-n NUM] [pos]
ipython3: error: one of the arguments pos -n/--num is required
我尝试给位置提供与可选项相同的dest
- 因此两者都会写入num
。但这会导致dest
的写入位置超出其默认值(我可以根据需要添加详细信息)
In [19]: a.dest
Out[19]: 'pos'
In [20]: a.dest='num'
In [21]: parser.parse_args(['--num','10'])
Out[21]: Namespace(num=0)
解析后的代码必须以任何有意义的方式处理args.pos
和args.num
值。
'-10
'输入是不可能处理的。好吧,我可以定义:
parser.add_argument('-1')
但结果可能不是你想要的:
In [31]: parser.parse_args(['--num=20','-12'])
Out[31]: Namespace(1='2', num='20', pos=0)
总的来说,这个要求会给程序员带来不必要的困难。