2016-10-11 59 views

回答

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.posargs.num值。

''-10'的输入是不可能处理的。好吧,我可以定义:

parser.add_argument('-1') 

但结果可能不是你想要什么:

​​

总体的这个要求会使你的东西不必要的困难程序员。

+0

感谢您的回答。我同意你关于'-10'形式的无用性。我在发布时正在考虑UNIX的tail命令,但这是一个非常具体的用法,最后不值得额外编码。我认为按照你的建议使用了互斥组,但在我看来,这是一种绕开“argparse”哲学(我不太喜欢)的定义和可选参数之间明显区别的方法。最后,如果我决定保留'argparse',我想我只会使用可选参数形式('-n','--num')。 – beppe

相关问题