2016-10-11 55 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

相關問題