命令行对象调度器

tambo的Python项目详细描述


tambo
==
为*每个*子命令使用*任意*参数解析器。轻松地将每个
命令作为一个独立的应用程序进行管理。

r/>
当程序的命令行界面超出几个标志和选项时,管理所有不同的选项和在一个地方发生的调用就变得很痛苦了。

`tambo`'s approach
----
如果我们能够**将命令行选项映射到对象并处理
一次*?处理子命令不取决于
构造的单个对象,而是从映射了第一级选项的对象的根开始的事件链。

代码块::python

parser=tambo.transport(args)
parser.mapper={'子命令':mysubcommandClass}
parser.dispatch()

n使用传入的参数和选项处理
的操作逻辑。

是否需要添加更多命令?只要将它们添加到这个根映射器中,它们就会保持独立。不需要在一个地方为所有
命令声明*every*single选项。这就是它寻找更多命令的方式:

…代码块::python

parser=tambo.transport(args)
parser.mapper={'subcommand':mysubcommandclass,
'bar':barclass,
'foo':fooclass}
parser.dispatch()

j
l当分派时未匹配任何内容时),则可以传递一个"with_exit"标志来获取一个名为"systemexit(0)"的"system exit":

parser.dispatch(with_exit=true)

您想要的解析器。*

让我们非常清楚地说明这一点:

=--
**python中的mand line option解析器都会遇到这种情况:``argparse``和``optparser``在调用接口时都需要一个显式地用参数构造对象。

例如,如果有
a`--verbose``标志,则首先需要将其添加到解析对象中,
大致如下:

……代码块::python

parser=parserrobject()
options,arguments=parser.parse戥args(args)

parser.add戥option('--verbose',action=-store戥true',help=-increase


,然后要对parser对象执行任何操作,都需要执行如下操作:


。代码块::python

if parser.verbose:
是试图处理对象构造的高需求。


当请求进入时,是否始终执行所有代码?



命令行类
----
命令行类是"tambo"在分派到
子命令时所期望的。它们需要遵循两个约束,但仍然允许
以任何方式处理命令行参数,使用所需的
库。

上面的erbose标志:

…代码块::python


class mysubcommand(object):

self.argv=argv

if'--verbose'in self.argv:
my\u program.verbose()

当类与根字典中定义的
映射匹配时,它将被调用,并将接收参数列表中的参数
(与在命令行上接收到的参数列表中的参数相同)。从上面可以看出,在cli上的调用应该是这样的:


my_cli子命令——verbose

>使用"tambo"解析的参数
-
尽管您可以使用任何所需的参数解析器,"`tambo"也带有自己的映射argum的小引擎
命令行中的ents to values,
表示期望的标志和参数:

。代码块::python


from tambo import transport


class mysubcommand(object):

self.argv=argv
self.parser=transport(self.argv)

def main(self):
if self.parser.has(''--verbose'):
my_program.verbose()

元组或列表,以便在映射
值时考虑它们。如果要定义别名,可以通过在传递给"transport"的主列表中的列表中对别名进行分组来完成此操作:

>;

>;>;>options=[[['-i','--import'],'--verbose']
>;>;>;parse=transport(sys_argv,options=options)
>;>;parse.parse_args()
>;>;parse.get('-i')
'somevalue'
>;>;parse.get('-import')
'somevalue'

因此别名通过将它们组合在一个列表中工作,但是
布尔标志会发生什么?您可以通过调用"has"方法来检查它们:



>;>;from tambo import transport
>;>;options=[['-i','--import'],'--verbose']
>;>;sys-argv=['/bin/myapp','--verbose']
>;>;parse=transport(sys-argv,options=options)
>;>;parse.parse_args()
>;>;parse.has('-i')
false
>;>;parse.has('--verbose')
true


>;>options=[['-i','--import'],'--verbose']
>;>sys_argv=['/bin/myapp','--verbose']
>;>parse=transport(sys_argv,options=options)
>;>parse.parse_args()
>;>parse.has('-i')
false
>;>;parse.has(['-v','--verbose'])
true




help generation
----
对于具有这些功能的子命令和命令行工具,一个常见的问题是以半自动方式生成帮助。`` tambo``有一种方法可以为
子命令执行此操作,如果有子命令,则通过调用help属性映射这些子命令,然后
在调用时将输出该信息:

。代码块::python

class mysubcommandclass(object):




,然后在参数处理程序中,它将自动调用检查是否存在帮助属性,以便在需要时显示它:

。代码块::python

parser是来自``tambo`
parser.parse_args()



ommands:

子命令执行某些操作的子命令

这是完全可选的,因为您可以通过告诉"transport"类避免检查它来避免调用捕捉帮助:

。代码块::python

parser=transport(sys.argv,check_help=false)


代码块::python

parser=transport(sys.argv,check_help=false)


if parser.has('--mandatory option'):
my_program.mandatory_thing()
else:
parser.print_help()

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java不可访问配置设计   在java中使用json就像在javascript中一样   java如何屏蔽Android 4.0主密钥   java为什么clickable的预期条件不执行click()?   Azure事件中心:Kafka消费者在java中不轮询任何内容   javajaxb和enum实现接口   java如何在标记下添加ProgressBar和按钮   java如何为对象实现arrayList   使用多重匹配重载java构造方法重载   java使用for循环和if语句搜索帐户   java JPanel在JPanel中添加了顶部填充   IntelliJ将Java项目/模块转换为Maven项目/模块   java如何迭代arraylist中的arraylist   自定义类的java“找不到符号”错误