在定製usage
的問題:
解析器構造函數採用usage
參數。立即生效的是設置一個屬性:
parser = argparse.ArgumentParser(... usage=custom_usage...)
print(parser.usage)
# should show None or the custom_usage string
作爲一個普通的Python對象屬性,您可以在創建解析器後對其進行更改。
usage_str = parser.format_usage()
的format_usage
方法要求創建將在幫助(和錯誤信息)中給出的使用的解析器。如果parser.usage
的值爲None
,則從參數中對其進行格式化。如果是一個字符串,它就是這樣使用的(我認爲它填充了像%(prog)s
這樣的值)。
所以你可以從頭開始寫一個用法字符串。或者,您可以設置解析器,獲取當前使用的字符串,並編輯它以滿足您的需要。編輯很可能是您在開發過程中要做的事情,同時在IDE中測試解析器。但它可以在飛行中完成。
的粗例子:
In [441]: parser=argparse.ArgumentParser()
In [442]: g=parser.add_mutually_exclusive_group()
In [443]: g.add_argument('--foo')
In [444]: g.add_argument('--bar')
In [445]: ustr = parser.format_usage()
# 'usage: ipython3 [-h] [--foo FOO | --bar BAR]\n'
In [450]: parser.usage = ustr.replace('[','(').replace(']',')')
In [451]: parser.format_usage()
# 'usage: usage: ipython3 (-h) (--foo FOO | --bar BAR)\n'
我已經更換了[]
與()
(甚至在-h
:()
現在測試args
屬性的邏輯組合是最好的選擇。解析器在parse_args
函數內部維護一個已經看到的參數列表(實際設置)。這用於測試所需的參數,以及用於互斥性的參數,但在代碼之外不可用。
對於store_true
(或false)參數,只需檢查它們的真值。對於其他我喜歡測試默認None
的人。如果使用其他default
值,請相應地進行測試。 None
的一個好處是用戶不能給你這個價值。
或許是爲了測試參數的最一般的方法是計數不屬於None
屬性的數量:
In [461]: args=argparse.Namespace(one=None, tow=2, three=None)
In [462]: ll = ['one','tow','three']
In [463]: sum([getattr(args,l,None) is not None for l in ll])
Out[463]: 1
0
意味着沒有找到;至少有一個禮物; ==len(ll)
全部找到; >1
違反互相排斥; '== 1'表示需要互斥。
對於Python錯誤/問題補丁我想知道什麼是這種'需要任何'條件的良好用法消息。 '|'已經用於互斥'xor'條件。像這樣的條件測試更容易設計一個好的API。 – hpaulj