我的问题本质上是对这个问题的跟进。这显示了如何使用plac
表示每个函数的子命令自动生成命令行界面。
是否可以讲述plac
所有子命令共有的选项,并且可以被视为“全局”选项?事实上,这些选项在没有子命令的情况下应该有意义。
例如,我可能有svn checkout
andsvn update
子命令,但也想要一个svn -v
orsvn --version
命令。
我的问题本质上是对这个问题的跟进。这显示了如何使用plac
表示每个函数的子命令自动生成命令行界面。
是否可以讲述plac
所有子命令共有的选项,并且可以被视为“全局”选项?事实上,这些选项在没有子命令的情况下应该有意义。
例如,我可能有svn checkout
andsvn update
子命令,但也想要一个svn -v
orsvn --version
命令。
几年前,我使用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, ...)
...
因此,虽然每个函数的参数必须完整拼写,但注释可以通过混合和匹配各种字典来构建。
我生疏了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 -v
is like -h
,一个特殊的论点。
p.parse_args([])
虽然给出了too few arguments
错误。即它需要一个子命令。如果“全局选项”类似于-d
.
几个资格:
新版本以不同的方式指定“版本”参数。
在 中3.3
,不再需要子命令。这是由于 required-arguments 错误消息发生了变化,未来的变化可能/也可能不正确。
我认为如果解析器由 生成,这些限制仍然适用plac
,但我必须检查plac
代码以确定。