我有一个带有多个子解析器的argparse
程序。如果未指定顶级参数的值,我希望它取决于子解析器的选择。这可以通过在每个子解析器上使用set_defaults()
来部分完成。但是,即使显式提供了顶级参数,传递的值也不像真正的默认值那样起作用。
我是否在argparse
模块中缺少某些东西,这些东西会允许特定于子解析器的默认值生成顶级解析器?下面是一个玩具示例,演示了我想要的用例
import argparse
# Top-level parser
parser = argparse.ArgumentParser()
parser.add_argument('-t','--time',type=str)
# Add subparsers with options
actions = parser.add_subparsers(dest='action',Metavar='action')
actions.required = True
eat = actions.add_parser('eat')
eat.add_argument('-f','--food',type=str,default='pizza')
order = actions.add_parser('order')
order.add_argument('-i','--item',type=int,required=True)
# Attempt to set main parser's --time depending on subparser selection
eat.set_defaults(time='Now')
order.set_defaults(time='later')
# Tests that work as expected
print(parser.parse_args(['order',0])) # Namespace(action='order',item=0,time='later')
print(parser.parse_args(['eat'])) # Namespace(action='eat',food='pizza',time='Now')
# Tests that DO NOT work
# Actual result: the --time flag of `parser` is ignored in preference of each subparser's default
# Desired result: explicit usage of --time should override the subparser defaults like the comments below
# Namespace(action='order',time='before')
# Namespace(action='eat',time='after')
print(parser.parse_args(['--time','before','order',0]))
print(parser.parse_args(['--time','after','eat']))