2016-01-12 61 views
0

也許有類似問題的答案,但我找不到它。Argparse:與默認值相互排斥的羣組

我需要什麼。

我有一張桌子可以閱讀:帶有最近數據(快速)的表格,含有一天(一天)數據的表格。

如果我在命令行中提供了一個參數-f,我想從缺省表和日期表中讀取。

然後我有每個參數的默認值。 因此,如果我不提供任何參數(「-s」或「-f」),我想使用默認值「day」。 如果我使用「-s 20161001」或「-f 1452557323」之類的東西,我想使用該值。 如果使用「-f」,我想使用「-f」默認值。

所有我現在的問題是:

table_choice = parser.add_mutually_exclusive_group(required=True) 

table_choice.add_argument(
    '-s', '--day-table', 
    dest='day', 
    help='day table data', 
    default="path/" + day(), 
) 

table_choice.add_argument(
    '-f', '--fast-table', 
    dest='fast', 
    help='fast table data', 
    default=fast(), 
) 

但可悲的是它不工作,像我想要的。 「腳本-f」 回報:

Script: error: argument -f/--fast-table: expected one argument 

只有當我提供了一個價值的作品。

回答

1

如果nargs='?',那麼你會得到一個3路動作 - 默認值,常量或值。

table_choice.add_argument(
    '-f', '--fast-table', 
    dest='fast', 
    help='fast table data', 
    default=fast(), 
    nargs='?', 
    const='value_if_noarg' 
) 

這個nargs與互斥組合(包括'required')很好地發揮。

通過使組required,您將不得不使用-s-f。省略required=True您是否希望使用兩種選項。

無論命令行中的內容如何,​​命名空間的值都將爲dayfast。如果您希望day值的優先級爲fast,請選擇defaults,以便區分默認值和給定值。默認的默認None對此很方便。

您可以使用default=argparse.SUPPRESS來保留命名空間外的默認值,但這比args.fast is None更難以測試。

正如Python argparse --toggle --no-toggle flag中所述,您的論點甚至可以共享dest。這是否使以下邏輯更容易或不可信,這是值得懷疑的。

+0

謝謝,正是我所需要的。對於「day」使用const和default,對於「fast」使用const。閱讀手冊時我是如何錯過的=) – antonavy