3

我的问题本质上是对这个问题的跟进。这显示了如何使用plac表示每个函数的子命令自动生成命令行界面。

是否可以讲述plac所有子命令共有的选项,并且可以被视为“全局”选项?事实上,这些选项在没有子命令的情况下应该有意义。

例如,我可能有svn checkoutandsvn update子命令,但也想要一个svn -vorsvn --version命令。

4

2 回答 2

1

几年前,我使用plac. 它有多个带有重叠参数集的命令。我会尝试抽象我所做的

class Interface(object):
    commands = ['fn1','fn2',...]
    dict1 = dict(quiet=(...), dryrun=(...), ...)
    dict2 = dict()
    dict3 = dict()

    dict1.update(dict2)
    @plac.annotations(**dict1)
    def fn1(self, dryrun, quiet, ...)
        ...
    @plac.annotations(foo=(...), **dict2)
    def fn2(self, foo, ...)
        ...
    @plac.annotations(**dict2)
    def fn3(self, ...)
        ...

因此,虽然每个函数的参数必须完整拼写,但注释可以通过混合和匹配各种字典来构建。

于 2013-08-17T06:57:13.183 回答
0

我生疏了plac,所以我将首先从基本argparse用法来解决这个问题。

p = argparse.ArgumentParser(version='1.2.3')
sp = p.add_subparser()
sp.add_parser('checkout')
sp.add_parser('update')

p.parse_args(['-v'])返回1.2.3和退出。But -vis like -h,一个特殊的论点。

p.parse_args([])虽然给出了too few arguments错误。即它需要一个子命令。如果“全局选项”类似于-d.

几个资格:

  • 新版本以不同的方式指定“版本”参数。

  • 在 中3.3,不再需要子命令。这是由于 required-arguments 错误消息发生了变化,未来的变化可能/也可能不正确。

我认为如果解析器由 生成,这些限制仍然适用plac,但我必须检查plac代码以确定。

于 2013-08-17T05:08:51.323 回答