2014-09-26 54 views
0

我在我的Python程序中遇到問題,我有兩個可選參數,問題是必須至少有一個這兩個參數必須被使用但兩個參數不能一起傳遞,是否有一種方法可以用argparse來做到這一點?Python argparse,有至少一個是必需的兩個可選參數

這是我目前使用的代碼:

parser = argparse.ArgumentParser(description='worker') 
arser.add_argument('-i', "--item", type=bool, default=False, required=False) 
parser.add_argument('-o', "--offer", type=bool, default=False, required=False) 

下面是我怎麼想它的一些例子來工作:

  • ./main.py -i True => OK

  • ./main.py -o True =>好吧

  • ./main.py -o True -i True =>不正常

+1

我對argparse瞭解不多,但這[[互斥]](http://argparse.googlecode.com/svn/trunk/doc/other-methods.html#mutual-exclusion)方法聽起來像這將是有益的。 – Kevin 2014-09-26 14:07:04

+0

無論何時您必須選擇「可選」參數,請考慮「subparsers」:'main.py item','main.py offer'。 – chepner 2014-09-26 14:20:45

回答

6

我建議,你重構的參數,並結合-o和-i到一個強制性的參數。 然後,使用的參數add_argument將參數o和i(或其他適當的參數)定義爲允許的值。

E.g:

parser.add_argument('foo', choices=['i', 'o']) 

現在,用戶必須指定兩個中的一個,但在同一時間不能同時指定。

+0

你不需要'required = True';位置參數總是*是必需的(好吧,只要你不設置'nargs ='?'',無論如何)。 – chepner 2014-09-26 14:22:06

+0

謝謝,我編輯了它! – Nick 2014-09-26 14:25:22

2

A mutually_exclusive_group會給你所需的,但不是兩個動作。

但首先,你不想要type=boolbool是將其輸入轉換爲TrueFalse的函數,但不會將字符串'False'轉換爲布爾型False。我建議使用action='store_true'來代替。

In [1]: import argparse 
In [2]: parser=argparse.ArgumentParser() 
In [3]: g = parser.add_mutually_exclusive_group(required=True) 
In [4]: g.add_argument('-i', '--item', action='store_true') 
In [5]: g.add_argument('-o', '--offer', action='store_true') 

In [6]: parser.parse_args('-i'.split()) 
Out[6]: Namespace(item=True, offer=False) 

In [7]: parser.parse_args('-o'.split()) 
Out[7]: Namespace(item=False, offer=True) 

In [8]: parser.parse_args('-o -i'.split()) 
usage: ipython [-h] (-i | -o) 
ipython: error: argument -i/--item: not allowed with argument -o/--offer 

In [11]: parser.parse_args(''.split()) 
usage: ipython [-h] (-i | -o) 
ipython: error: one of the arguments -i/--item -o/--offer is required 

它引發錯誤既不是-i-o被使用,或者如果兩者。如果使用其中一個,則它將適當的屬性設置爲True。請注意,使用行用(-i | -o)表示此「獨佔」或「邏輯」。

相關問題