2015-07-02 40 views
1

我的腳本正在接受使用ArgParse的--full--last--check。如果沒有提供選項,則只顯示幫助消息。但是在該消息中,參數顯示爲可選。如何指示至少需要一個參數?

usage: script.py [-h] [--full] [--last] [--check log_file]

如果我使用關鍵字required,那麼該腳本會一直期待的參數,這是不正確的。

usage: script.py [-h] --full --last --check log_file

那麼,我該怎麼讓這樣的:

usage: script.py [-h] (--full |--last |--check log_file)

表明幫助是可選的,但這些參數的至少一個是必需的。

+0

對於Python錯誤/問題補丁我想知道什麼是這種'需要任何'條件的良好用法消息。 '|'已經用於互斥'xor'條件。像這樣的條件測試更容易設計一個好的API。 – hpaulj

回答

2

在定製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'表示需要互斥。

0

您可以使用add_mutually_exclusive_group()

parser = argparse.ArgumentParser() 
group = parser.add_mutually_exclusive_group (required = True) 
group.add_argument ('--foo') 
group.add_argument ('--bar') 

然而,主要的影響是,你將無法同時使用多個選項。

+0

我對if-else有同樣的效果。我忘了提及我對允許完整或最後一次檢查感興趣,並且同時檢查 – yzT

1

由於@doublep在他的回答解釋說,如果你想使用在同一時間多個選項:

更改usage消息手動你想要的。

Python argparse: Make at least one argument required添加以下代碼:

if not (args.full or args.last or args.check): 
    parse.error('[-] Error: DISPLAY_ERROR_MESSAGE') 
+0

我想編輯顯示在幫助上的用法信息,但似乎不可能,所以我要寫一個指示用戶的自定義信息使用 - - help – yzT

+0

'old_usage = parser.format_usage()'給出格式化的使用行。你可以編輯它,並用'parser.usage = new_usage'指定它。 – hpaulj

+1

@hpaulj我昨天也找到了。在創建ArgumentParser對象時,一個可選參數是'usage',這正是我所需要的。來這裏發佈這個答案並且看到你的評論,所以如果你願意,回答這個問題,我選擇它。 – yzT

相關問題