我有一个我正在构建的CLI,它使用subparsers作为类似git等工具的子命令。我的一些子命令共享公共选项,因此我有一个定义选项的组解析器,每个需要它们的子命令都使用parents=group_parser
作为参数之一。例如:
group_parser = argparse.ArgumentParser()
group_parser.add_argument('-f', '--foo', action='store_true')
command1_parser = subparsers.add_parser('command1', parents=[group_parser])
command2_parser = subparsers.add_parser('command2', parents=[group_parser])
因此,当您看到command1和command2都继承选项--foo
时。我要做的是在command1和command2上分别更新foo的helptext。例如,如果我运行myprog command1 -h
,我希望它在--foo
运行myprog command2 -h
时为parse_args()
说出不同的帮助消息。问题是直到我group_parser = argparse.ArgumentParser()
group_parser.add_argument('-f', '--foo', action='store_true')
command1_parser = subparsers.add_parser('command1', parents=[group_parser])
command1.foo['help'] = "foo help for command1"
command2_parser = subparsers.add_parser('command2', parents=[group_parser])
command2.foo['help'] = "foo help for command2"
没有要为该参数更新的命名空间,所以像这样的东西不起作用:
add_argument()
这是否可以以某种方式向fopen()
函数之外的参数添加其他参数?唯一的另一个解决方案是不使用继承的父级,只为每个子命令分别定义foo,但如果有更新参数的方法,那将是理想的。
答案 0 :(得分:1)
创建Action(参数)后,有一种方法可以更改help
(以及其他Action属性)。但是使用parents
机制存在另一个问题 - 操作通过引用复制。因此,即使您可以更改help
的{{1}},也最终会将其更改为command1
。我在尝试更改command2
等属性时遇到过此问题。
我将添加插图,可能是之前讨论的链接。
default
In [2]: parent = argparse.ArgumentParser(add_help=False)
In [4]: fooObj = parent.add_argument('--foo',default='foo1', help='foo help')
是对此fooObj
创建的操作的引用。
add_argument
更改帮助属性:
In [5]: fooObj.default
Out[5]: 'foo1'
In [6]: fooObj.help # the help parameter
Out[6]: 'foo help'
In [7]: parent.print_help()
usage: ipython3 [--foo FOO]
optional arguments:
--foo FOO foo help
现在制作一个解析器和子分析器
In [8]: fooObj.help = 'new help'
In [9]: parent.print_help()
usage: ipython3 [--foo FOO]
optional arguments:
--foo FOO new help
In [10]: parser = argparse.ArgumentParser()
In [11]: sp = parser.add_subparsers()
In [13]: cmd1 = sp.add_parser('cmd1',parents=[parent])
In [14]: cmd2 = sp.add_parser('cmd2',parents=[parent])
In [15]: cmd2.print_help()
usage: ipython3 cmd2 [-h] [--foo FOO]
optional arguments:
-h, --help show this help message and exit
--foo FOO new help
是为解析器定义的参数列表:
_actions
比较ID我们可以看到2d动作与In [16]: cmd1._actions
Out[16]:
[_HelpAction(option_strings=['-h', '--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='show this help message and exit', metavar=None),
_StoreAction(option_strings=['--foo'], dest='foo', nargs=None, const=None, default='foo1', type=None, choices=None, help='new help', metavar=None)]
相同。与fooObj
相同。
cmd2
更改In [17]: id(cmd1._actions[1])
Out[17]: 2885458060
In [18]: id(fooObj)
Out[18]: 2885458060
的{{1}}也会更改help
cmd1
这是尝试为子分析器提供不同默认值的情况:
argparse - Combining parent parser, subparsers and default values
最好使用您自己的实用程序函数将子参数添加到子分析程序中。这样每个subparser都可以拥有自己的Action对象副本,而不是共享它们。我认为cmd2
机制在理论上比在实践中更好。