Google 开源的 Python 命令行库:初探 fire

发布时间:2024-12-13  


一、前言

在本系列前面所有文章中,我们分别介绍了 argparse、docopt和 click的主要功能和用法。它们各具特色,都能出色地完成命令行任务。argparse是面向过程的,需要先设置解析器,再定义参数,再解析命令行,最后实现业务逻辑。docopt先用声明式的语法定义出参数,再过程式地解析命令行和实现业务逻辑。click则是用装饰器的方式进一步简化显式的命令调用逻辑,但仍然不够面向对象。

而今天要介绍的 fire则是用一种面向广义对象的方式来玩转命令行,这种对象可以是类、函数、字典、列表等,它更加灵活,也更加简单。

本系列文章默认使用 Python 3 作为解释器进行讲解。
若你仍在使用 Python 2,请注意两者之间语法和库的使用差异哦~

二、介绍

fire 可以根据任何 Python 对象自动生成命令行接口。它有如下特性:

  • 能以简单的方式生成 CLI
  • 是一个开发和调试 Python 代码的实用工具
  • 能将现存代码或别人的代码转换为 CLI
  • 使得在 Bash 和 Python 间的转换变得更容易
  • 通过预先为 REPL 设置所需的模块和变量,使得实用 REPL 更加容易

通过如下命令可快速安装 fire库:

pip install fire

三、快速开始

回忆下使用 argparse、docopt和 click实现命令行程序的步骤:

  • 对于 argparse来说,要先设置解析器,再定义参数,再解析命令行,最后实现业务逻辑(四步)
  • 对于 docopt来说,要先定义定义接口描述,再解析命令行,最后实现业务逻辑(三步)
  • 对于 click来说,就是实现业务逻辑和通过装饰器的方式定义参数(两步)

它们的实现步骤越来越简单,从四步简化到了两步。而今天的主角 fire只需一步,现业务逻辑就够了。

这简直简单的不可思议,为什么这样做就够了?我们不妨考虑下 Python 中的函数,函数是不是可以对应一个命令行程序,而函数的参数可以对应命令行程序的参数和选项呢?再看看 Python 中的类,一个类是不是可以对应一个命令行程序,而类中的每个实例方法就可以对应子命令,实例方法中的参数就是对应子命令的参数和选项。

这么一想,理论上确实是可以实现的,我们不妨通过下面的示例来看看 fire是如何让我们通过简单的方式实现命令行程序。

3.1 使用函数

来看这么一个例子:

import fire def hello(name="World"): return 'Hello {name}!'.format(name=name) if __name__ == '__main__':
  fire.Fire(hello)

在上述例子中定义一个 hello函数,它接受 name参数,并且有默认值 "World"。使用 fire.Fire(hello)即可非常简单快速地实现命令功能,这个命令行就接受 --name选项,不提供时使用默认值 "World",提供时就按提供的值来。

可在命令行中执行下列命令:

$ python hello.py
Hello World!
$ python hello.py --name=Prodesire
Hello Prodesire!
$ python hello.py --help INFO: Showing help with the command 'hello.py -- --help'.

NAME
    hello.py

SYNOPSIS
    hello.pyFLAGS
    --name=NAME

3.2 使用类

使用函数是最简单的方式,如果我们想以更有组织的方式来实现,比如使用类,fire也是支持的。

import fire class Calculator(object): """A simple calculator class.""" def double(self, number): return 2 * number def triple(self, number): return 3 * number if __name__ == '__main__':
  fire.Fire(Calculator)

在上述例子中定义一个 Calculator类,它有两个实例方法 double和 triple,并且都接受 number参数,没有默认值。使用 fire.Fire(Calculator)即可非常简单快速地实现命令功能,这个命令行支持两个子命令 double和 triple,位置参数 NUMBER或选项参数 --number

可在命令行中执行下列命令:

$ python calculator.py double 10
20
$ python calculator.py triple --number=15
45
$ python calculator.py double --help INFO: Showing help with the command 'calculator.py double -- --help'.

NAME
    calculator.py double

SYNOPSIS
    calculator.py double NUMBER

POSITIONAL ARGUMENTS
    NUMBER

NOTES
    You can also use flags syntax for POSITIONAL ARGUMENTS

四、小结

fire的使用方式非常简单,定一个 Python 对象,剩下的就交给 fire来处理,可谓是非常的 Pythonic,这也是它会如此受欢迎的原因。

除了上面展示的内容,fire还支持更多种类的 Python 对象,也拥有很多强大的功能,我们将在接下来几节中逐步走近它。

文章来源于:21IC    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>