来自父

时间:2017-08-21 23:03:07

标签: python argparse subparsers

我有一个我正在构建的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,但如果有更新参数的方法,那将是理想的。

1 个答案:

答案 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机制在理论上比在实践中更好。