也许有一个类似问题的答案,但我无法找到它。
我需要什么。
我有一个表可供阅读:包含最新数据的表(快速),包含一天(天)数据的表。
我想默认从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
仅在我提供了值时才有效。
答案 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
你想要选择不使用它们。
无论命令行中的内容如何,命名空间都将包含day
和fast
的值。如果您希望day
值具有fast
优先级,请选择defaults
,以便区分默认值和给定值。默认默认值None
非常方便。
您可以使用default=argparse.SUPPRESS
将默认值保留在命名空间之外,但这比args.fast is None
更难测试。
如Python argparse --toggle --no-toggle flag中所述,您的论据甚至可以共享dest
。这是否使以下逻辑更容易是值得怀疑的。