开云-Google 开源的 Python 命令行库:深入 fire(一)

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=0200
2.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文档 下载文档

上一篇:开云-FPGA实现串口升级及MultiBoot(二)FPGA启动流程 下一篇:开云-Python 命令行之旅:深入 click 之增强功能