2017-05-16 46 views
1

使用python的argparse庫,我想處理前幾個命令行參數並使用它們爲其他命令行參數生成一個選項列表。Python argparse:在添加其他參數之前處理某些參數

我該如何處理前幾個參數而沒有argparse抱怨它不指望的額外參數(我打算稍後添加)?

例如,我有一個腳本,獲取來自命令行的用戶名和密碼,使用這些訪問的API的可用的屬性,然後使用該列表來限制第三個參數的值:

import argparse 

parser = argparse.ArgumentParser() 
parser.add_argument('username', help='Your username.') 
parser.add_argument('password', help='Your password.') 
args = parser.parse_args() # Error here because a third argument exists on the command-line 

response = requests.get(
    url='https://api.example.com/properties', 
    auth=(args.username, args.password) 
) 

parser.add_argument(
    'property', 
    choices=response.json()['properties'], # Validates the input 
    help='The property you want to access.' 
) 
args = parser.parse_args() 

我知道我可以一次添加所有參數,然後自己手動驗證第三個參數,但是我想知道是否有一種方法可以本地執行我在argparse庫中要求的操作?

+0

你檢查是否http://stackoverflow.com/questions/20165843/argparse-how-to-handle-variable-number-of-arguments-nargs回答你的問題? –

+0

'argparse'就像名稱解析器一樣。它具有驗證要分析的數據的功能,但此驗證具有限制。做HTTP查詢絕對不在這個限制之內。你必須在代碼中完成。另外,考慮一下,如果不將證書作爲參數提供給您,您的方法將不允許顯示幫助,但在您看到幫助之前您不知道如何。 –

+1

@ Chih-HsuJackLin儘管它並不直接回答我的問題,但在接受的答案中,我看到使用了'parse_known_args()'函數(我沒有意識到),我可以使用它來解析參數塊一次。 @KlausD。我看到你關於不完整的幫助文檔的觀點。我會堅持一次添加所有參數並自己驗證。謝謝你們倆。 – ezgoodey

回答

1
parser = argparse.ArgumentParser() 
parser.add_argument('username', help='Your username.') 
parser.add_argument('password', help='Your password.') 
parser.add_argument(
    'property', 
    help='The property you want to access.' 
) 
args = parser.parse_args() 

response = requests.get(
    url='https://api.example.com/properties', 
    auth=(args.username, args.password) 
) 
allowed_properties = response.json()['properties'] 
if args.property not in allowed_properties: 
    parser.error('property not in allowed properties') 

choices不是一個複雜的測試。我建議解析所有輸入,然後測試這個特殊情況。總體而言,我認爲給你更好的控制,更好的幫助和錯誤顯示。

parse_known_args方法很好學習和偶爾使用,但我不認爲這是偉大的這種情況。您不會在parser中獲得任何額外的積分來嵌入所有參數測試。