当前位置: 首页 > 后端技术 > Python

彩虹堂系统开发

时间:2023-03-26 19:41:06 Python

【谷歌开源Python命令行库:彩虹堂系统开发框架搭建:I8O.2853.296OVLi,深入火力(一)】作者:HelloGitHub-ProdesireHelloGitHub的《讲解开源项目》系列,项目地址:https://github.com/HelloGitHub-Team/Article一、前言在第一篇《探索火》中,我们初步掌握了使用火的简单步骤,学习了它的Pythonic用法。今天我们将深入探讨fire的子命令、嵌套命令和属性访问功能。本系列文章默认使用Python3作为解释器。如果你还在使用Python2,请注意两者在语法和库使用上的区别~2.函数2.1子命令使用fire实现子命令的方式有很多种:2.1.1定义几个函数,使用fire.Fire()实现子命令最简单的方法是定义几个函数,每个函数名隐式为子命令的名称,然后调用fire.Fire()将当前模块的所有函数解析为对应子命令的处理函数.importfiredefadd(x,y):returnx+ydefmultiply(x,y):returnx*yif__name__=='__main__':fire.Fire()然后我们可以在命令行中调用它:$pythonexample。pyadd102030$pythonexample.pymultiply1020200关于如何识别参数类型,比如上面的10和20add1020是数字而不是字符串。我们将在下一篇的参数解析章节进行讲解。2.1.2定义几个函数,使用fire.Fire()在2.1.1版本中,所有的函数都将被视为子命令。有时我们可能只想把一些函数当作子命令,或者希望子命令名与函数名不同。这时候我们就可以通过字典对象显式的告诉fire。字典对象的形式是{'子命令名':函数}。比如前面的例子,我们希望最后的子命令是add和mul,那么我们可以这样写:fire.Fire({'add':add,'mul':multiply,})然后我们就可以调用它了在命令行上:$pythonexample.pyadd102030$pythonexample.pymul10202002.1.3定义类和方法,使用fire.Fire()来定义类和我们在上一篇文章中介绍过这种方式的方法。它与定义函数的方式基本相同,只是它是以类的方式组织的。然后实例化该类,将实例化后的对象作为fire.Fire的输入参数:importfireclassCalculator(object):defadd(self,x,y):returnx+ydefmultiply(self,x,y):returnx*yif__name__=='__main__':calculator=Calculator()fire.Fire(calculator)2.1.4定义了类和方法,使用fire.Fire()和2.1.3的唯一区别是把类代替实例对象作为fire.Fire的输入参数:fire.Fire(Calculator)传递类的基本功能与实例对象相同,但是传递类有一个额外的特点:如果参数定义在构造函数,那么这些参数将作为整个命令行程序的选项参数。导入fireclassBrokenCalculator(object):def__init__(self,offset=1):self._offset=offsetdefadd(self,x,y):returnx+y+self._offsetdefmultiply(self,x,y):returnx*y+self._offsetif__name__=='__main__':fire.Fire(BrokenCalculator)查看帮助命令:$pythonexample.py--helpINFO:Showinghelpwiththecommand'example.py----help'。NAMEexample.pySYNOPSISexample.pyFLAGS--offset=OFFSET可以看出构造函数BrokenCalculator.__init__(self,offset=1)中的offset自动转换为命令中的全局选项参数--offset行,默认值为1。我们可以在命令行中这样调用它:$pythonexample.pyadd102031$pythonexample.pymultiply1020201$pythonexample.pyadd1020--offset=030$pythonexample.pymultiply1020--offset=02002.2命令组/嵌套命令为了实现嵌套命令,可以组织多个类。示例如下:classIngestionStage(object):defrun(self):return'Ingestion!Nomnomnom...'classDigestionStage(object):defrun(self,volume=1):return''.join(['Burp!']*volume)defstatus(self):return'Satiated.'类Pipeline(object):def__init__(self):self.ingestion=IngestionStage()self.digestion=DigestionStage()defrun(self):self.ingestion.run()self.digestion.run()如果__name__=='__main__':fire.Fire(Pipeline)在上面的例子中:IngestionStage实现子命令runDigestionStage实现子命令run和statusPipeline在子命令run和statusPipeline的构造函数中,IngestionStage被实例化为ingestion,DigestionStage被实例化为digestion,并且这两个放在一个命令组中,所以支持:ingestionrundigestionrundigestionstatusPipeline实现了子命令run,所以整个命令行程序支持如下命令:runningestionrundigestionrundigestionstatus然后我们可以在命令行调用:e.py正在运行!Nomnomnom...打嗝!$pythonexample.pyingestionrunIngesting!nomnomnom...$pythonexample.pydigestionrunBurp!$pythonexample.pydigestionstatusSatiated.2.3attributeaccessattributeaccess很火相对于其他命令行库,一个比较独特的功能,也就是所谓的accessattribute,是获取预设属性对应的值。比如在命令行指定--code,告诉程序要查询的程序编码,然后希望通过zipcode属性返回邮政编码,通过city属性返回城市名称。那么该属性可以作为一个实例成员属性来实现:importfirecities={'hz':(310000,'杭州'),'bj':(100000,'北京'),}classCity(object):def__init__(self,代码):info=cities.get(code)self.zipcode=info[0]ifinfoelseNoneself.city=info[1]ifinfoelseNoneif__name__=='__main__':fire.Fire(City)使用方法如下:$pythonexample.py--codebjzipcode100000$pythonexample.py--codehzcityHangzhou3.总结使用fire实现子命令和嵌套命令比其他命令行库更简单明了。不仅如此,fire还提供了更独特的访问属性的能力。在下一篇文章中,我们将进一步了解fire,并介绍它的链式函数调用、自定义序列化、参数解析、fire选项等更高级的功能。《讲解开源项目系列》——让对开源项目感兴趣的人不再害怕,让开源项目的发起者不再孤单。关注我们的文章,您将发现编程的乐趣,使用并发现参与开源项目是多么容易。欢迎留言联系我们,加入我们,让更多人爱上开源,为开源做贡献~