开云-BPO行业整合方案提供者
专业化、科技化、国际化;高标准、广覆盖、全流程
了解更多Google 开源的 Python 号令行库:深切 fire(一) 时候:2024-12-13 21:18:32 手机看文章
扫描二维码随时随地手机看文章
1、媒介
在第一篇“初探 fire”的文章中,我们初步把握了利用 fire的简单步调,领会了它 Pythonic 的用法。
今天我们将深切领会 fire的子号令、嵌套号令和属性拜候功能。
本系列文章默许利用 Python 3 作为注释器进行讲授。若你仍在利用 Python 2,请留意二者之间语法和库的利用差别哦~2、功能 2.1 子号令
利用 fire实现子号令有多种体例:
2.1.1 界说若干函数,利用 fire.Fire()实现子号令最简单的体例就是界说若干个函数,每一个函数名隐式就是子号令名称,然后挪用 fire.Fire()变将当前模块所有的函数解析为对应的子号令的处置函数。
import fire def add(x, y): return x + y def multiply(x, y): return x * y if __name__ == '__main__': fire.Fire()
然后我们便可以在号令行中这么挪用:
美金 python example.py add 10 2030美金 python example.py multiply 10 20200
关在若何辨认参数类型,好比上述 add 10 20中 10和 20是作为数字而非字符串,我们会鄙人篇文章的参数解析章节中进行讲授。
2.1.2 界说若干函数,利用 fire.Fire()在 2.1.1的版本中,会把所有函数都当作是子号令。有时我们可能只想把部门函数当作子号令,或是但愿子号令名称和函数名称纷歧样。这个时辰我们便可以经由过程字典对象显式地告知 fire。
字典对象的情势为 {'子号令名称': 函数},好比前面的示例中,我们但愿终究的子号令为 add和 mul,那末便可以这么写:
fire.Fire({ 'add': add, 'mul': multiply,})
然后我们便可以在号令行中这么挪用:
美金 python example.py add 10 2030美金 python example.py mul 10 20200
sa
2.1.3 界说类和方式,利用 fire.Fire()界说类和方式的这类体例我们在上一篇文章中介绍过,它和界说函数的体例根基不异,只不外是用类的体例来组织。
然后将类实例化,并把实例化的对象多为 fire.Fire的入参:
import fire class Calculator(object): def add(self, x, y): return x + y def multiply(self, x, y): return x * y if __name__ == '__main__': calculator = Calculator() fire.Fire(calculator)2.1.4 界说类和方式,利用 fire.Fire()
和 2.1.3中的独一分歧点是把类而非实例对象作为 fire.Fire的入参:
fire.Fire(Calculator)
传递类和实例对象的根基感化是一样的,但传递类还一个额外的特征:假如组织函数中界说了参数,那末这些参数城市作为全部号令行法式的选项参数。
import fire class BrokenCalculator(object): def __init__(self, offset=1): self._offset = offset def add(self, x, y): return x + y + self._offset def multiply(self, x, y): return x * y + self._offset if __name__ == '__main__': fire.Fire(BrokenCalculator)
查看帮忙号令有:
美金 python example.py --help INFO: Showing help with the command 'example.py -- --help'.NAME example.pySYNOPSIS example.pyFLAGS --offset=OFFSET
因而可知组织函数 BrokenCalculator.__init__(self, offset=1)中的 offset主动转换为了号令行中的全局选项参数 --offset,且默许值为 1。
我们可以在号令行中这么挪用:
美金 python example.py add 10 2031美金 python example.py multiply 10 20201美金 python example.py add 10 20 --offset=030美金 python example.py multiply 10 20 --offset=02002.2 号令组/嵌套号令
想要实现嵌套号令,可将多个类组织起来,示例以下:
class IngestionStage(object): def run(self): return 'Ingesting! Nom nom nom...' class DigestionStage(object): def run(self, volume=1): return ' '.join(['Burp!'] * volume) def status(self): return 'Satiated.' class Pipeline(object): def __init__(self): self.ingestion = IngestionStage() self.digestion = DigestionStage() def run(self): self.ingestion.run() self.digestion.run() if __name__ == '__main__': fire.Fire(Pipeline)
在上面的示例中:
IngestionStage实现了子号令 run DigestionStage实现了子号令 run和 status Pipeline的组织函数中将 IngestionStage实例化为 ingestion,将 DigestionStage实例化为 digestion,就将这两个放到一个号令组中,因此撑持了: ingestion run digestion run digestion status Pipeline实现了子号令 run是以全部号令行法式撑持以下号令:
run ingestion run digestion run digestion status然后我们便可以在号令行中这么挪用:
美金 python example.py runIngesting! Nom nom nom...Burp!美金 python example.py ingestion runIngesting! Nom nom nom...美金 python example.py digestion runBurp!美金 python example.py digestion statusSatiated.2.3 属性拜候
属性拜候是 fire相对其他号令行库来讲一个比力怪异的功能。所谓拜候属性是获得预置的属性所对应的值。
举个例子,在号令行中指定 --code来奉告法式要查询的法式编码,然后但愿经由过程 zipcode属性返回邮编,经由过程 city属性返回城市名。那末属性可实现为实例成员属性:
import firecities = { 'hz': (310000, '杭州'), 'bj': (100000, '北京'),} class City(object): def __init__(self, code): info = cities.get(code) self.zipcode = info[0] if info else None self.city = info[1] if info else None if __name__ == '__main__': fire.Fire(City)
利用体例以下:
美金 python example.py --code bj zipcode100000美金 python example.py --code hz city杭州3、小结
利用 fire实现子号令和嵌套号令相对其他号令行库来讲都加倍简单清楚,不但如斯,fire还供给了属性拜候这类较为怪异的能力。
欲知详情,请下载word文档 下载文档