1
我想要一个必要的命令行参数作为位置参数或可选参数传递。例如,我想要从以下任何调用执行相同的操作:argparse:让相同的必需参数为位置或可选
prog 10
prog -10
prog -n 10
prog --num 10
这是可能的argparse?
我想要一个必要的命令行参数作为位置参数或可选参数传递。例如,我想要从以下任何调用执行相同的操作:argparse:让相同的必需参数为位置或可选
prog 10
prog -10
prog -n 10
prog --num 10
这是可能的argparse?
随着互斥组我可以创建一个合理的近似值:
在交互式会话:
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')
但结果可能不是你想要什么:
总体的这个要求会使你的东西不必要的困难程序员。
感谢您的回答。我同意你关于'-10'形式的无用性。我在发布时正在考虑UNIX的tail命令,但这是一个非常具体的用法,最后不值得额外编码。我认为按照你的建议使用了互斥组,但在我看来,这是一种绕开“argparse”哲学(我不太喜欢)的定义和可选参数之间明显区别的方法。最后,如果我决定保留'argparse',我想我只会使用可选参数形式('-n','--num')。 – beppe