2015-11-10 57 views
2

我試圖argparse使用創造條件,使我鍵入我的Unix主機的實例:的Python 2.7 Argparse是或否輸入

python getFood.py --food <(echo Bread) --calories yes 

我已經實現了食物的選擇,並希望增加的熱量是或沒有選項(二進制輸入)使用argparse,它將決定是否從我導入的類中調用卡路里方法。

我當前的代碼主程序是:

parser = argparse.ArgumentParser(description='Get food details.') 
parser.add_argument('--food', help='name of food to lookup', required=True, type=file) 
args = parser.parse_args() 

這成功地允許我使用上述返回食品詳細信息中顯示第一食品的選擇。

基本上我想添加第二個二元選項,如果用戶指示真實,會調用額外的方法。任何幫助我將如何編輯我的主例程argparse參數?我對argparse還很陌生。

+0

什麼?我明白所有的話,但我不明白你正在嘗試做的 –

+0

'型= file'作品,但可能不會做你期望的。在Python2中'file'和'open'是一樣的,它是打開一個文件的函數。所以是的,你可以做'args.food.read()'。 'type = argparse.FileType('r')'可以更好地控制文件的打開方式。 'file'在Python3中沒有定義。 – hpaulj

回答

9

您可以簡單地添加一個參數action='store_true',如果不包含--calories,將會默認args.calories爲False。爲了進一步澄清,如果用戶增加了--caloriesargs.calories將被設置爲True

parser = argparse.ArgumentParser(description='Get food details.') 
# adding the `--food` argument 

parser.add_argument('--food', help='name of food to lookup', required=True, type=file) 
# adding the `--calories` argument 
parser.add_argument('--calories', action='store_true', dest='calories', help='...') 
# note: `dest` is where the result of the argument will go. 
# as in, if `dest=foo`, then `--calories` would set `args.foo = True`. 
# in this case, it's redundant, but it's worth mentioning. 

args = parser.parse_args() 

if args.calories: 
    # if the user specified `--calories`, 
    # call the `calories()` method 
    calories() 
else: 
    do_whatever() 

不過,如果你想具體檢查yesno,然後更換store_true

parser.add_argument('--calories', action='store_true', dest='calories', help='...') 

store,如下圖所示

parser.add_argument('--calories', action='store', dest='calories', type='str', help='...') 

這一操作將允許您以後檢查

if args.calories == 'yes': 
    calories() 
else: 
    do_whatever() 

請注意,在這種情況下,我加入type=str,其解析參數作爲一個字符串。既然你指定的選擇是要麼yesno,​​實際上允許我們進一步指明可能的輸入與choices域:

parser.add_argument('--calories', action='store', dest='calories', type='str', 
        choices=['yes', 'no'], help='...') 

現在,如果用戶輸入任何['yes', 'no']沒有,這將提高一個錯誤。

最後一個可能性添加default,這樣用戶不必一定指定特定標誌的所有時間:

parser.add_argument('--calories', action='store', dest='calories', type='str', 
        choices=['yes', 'no'], default='no', help='...') 

編輯:@ShadowRanger在評論中指出,在這種情況下, dest='calories'action='store'type='str'是默認值,所以你可以忽略它們:

parser.add_argument('--calories', choices=['yes', 'no'], default='no', help='...') 
+0

我認爲這是正確的答案....但我真的不知道從原來的問題...好的工作解析+1(我不認爲你需要dest參數雖然) –

+0

@JoranBeasley他是一個LL(1)解析器... – erip

+2

注意:'action =「store 「'和'dest ='calories''已經是默認值。對於'action =「store」','type ='str''也是默認值。所以你可以忽略所有這些,只要做:'parser.add_argument(' - calories',choices =('yes','no'),default ='no',help ='...')' – ShadowRanger