Argparse:具有默认值的互斥组

Argparse: mutually exclusive groups with defaults

也许有一个类似问题的答案,但我找不到。

我需要的

我有一个 table 可以读取:table 包含最新数据(快速),table 包含一天(天)的数据。

如果我在命令行中提供参数 -f,我想默认从 day-table 和 fast-table 读取。

然后我为每个参数设置默认值。 因此,如果我不提供任何参数(“-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(),
)

但遗憾的是它并没有像我想要的那样工作。 "script -f" returns:

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

只有在我提供了一个值时才有效。

如果 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 以便您可以区分默认值和给定值。默认的 default None 很方便。

您可以使用 default=argparse.SUPPRESS 将默认值保留在命名空间之外,但这比 args.fast is None.

更难测试

中所述,您的论点甚至可以共享 dest。这是否使以下逻辑更容易值得怀疑。