Argparse:具有默认值的互斥组

时间:2016-01-12 19:11:17

标签: python argparse

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

我需要什么。

我有一个表可供阅读:包含最新数据的表(快速),包含一天(天)数据的表。

我想默认从day-table读取,如果我在命令行中提供参数-f,则从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"返回:

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

仅在我提供了值时才有效。

1 个答案:

答案 0 :(得分: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,您必须使用-s-f。省略required=True你想要选择不使用它们。

无论命令行中的内容如何,​​命名空间都将包含dayfast的值。如果您希望day值具有fast优先级,请选择defaults,以便区分默认值和给定值。默认默认值None非常方便。

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

Python argparse --toggle --no-toggle flag中所述,您的论据甚至可以共享dest。这是否使以下逻辑更容易是值得怀疑的。