p = argparse.ArgumentParser()
p.add_argument('-r', '--rule', nargs='?', default='string')
args = p.parse_args()
print args
與nargs='?'
產生Namespace(rule='string')
如果調用沒有參數。用-r
,參數是Namespace(rule=None)
。並且Namespace(rule='something')
與-r something
。
允許添加的代碼
if args.rule is None:
print '\n Error: no input value for rule:'
print ' resetting rule to default value.'
args.rule = 'string'
print args
幾行現在用 '-R'(或--rule
)的輸出是:
Namespace(rule=None)
Error: no input value for rule:
resetting rule to default value.
Namespace(rule='string')
在其他情況下是相同的。
如果我放棄default
; p.add_argument('-r', '--rule', nargs='?')
,由於缺省值(在argparse中)爲None
,所以沒有參數的情況下也會產生這個定製的'錯誤消息'。
它可以添加自定義錯誤與自定義type
或action
檢查,但使用更簡單,更容易理解後,我覺得測試爲None
。
我建議將error message
更改爲warning
。錯誤通常會終止程序;警告會打印該消息並繼續。
這是nargs=2
(或其他固定的東西)的解決方案。這不是微不足道的變化,因爲它涉及重新定義error
方法(記錄在文檔末尾附近),然後捕獲它產生的錯誤。 error
方法無法訪問名稱空間(參數),也不能繼續parse_args
。因此,如果rule
參數存在問題,則無法處理任何其他參數。
class MyParser(argparse.ArgumentParser):
def error(self, message):
if 'rule' in message:
message = 'wrong number of input values for rule'
raise argparse.ArgumentError(None,message)
# cannot access namespace or continue parsing
else:
super(MyParser, self).error(message)
p = MyParser()
p.add_argument('-r', '--rule', nargs=2)
try:
args = p.parse_args()
except argparse.ArgumentError as e:
print e
args = argparse.Namespace(rule='default')
# create a namespace with this default value
print args
記住nargs
有2個目的: - 如果參數字符串的一個錯誤的號碼被賦予 引發一個錯誤 - 分配多個操作中的多個參數字符串(由add_argument
創造的東西)。
第二個特別明顯,例如,如果您有幾個參數,分別取1,2和*參數。這是argparse的一個重要的新功能,至少與早期的Python解析器相比。雖然可以調整它,但很難完全重新定義它。
如果參數允許,您可以使用nargs='*'
而不是'?',如果字符串的數量不是'2'(或其他),則發出警告。
nvrmnd,解決了這個問題 – user2998514