作者:HelloGitHub-Prodesire 一、前言在本系列前面所有文章中,我们分别介绍了 argparse、docopt 和 click 的主要功能和用法。它们各具特色,都能出色地完成命令行任务。argparse 是面向过程的,需要先设置解析器,再定义参数,再解析命令行,最后实现业务逻辑。docopt 先用声明式的语法定义出参数,再过程式地解析命令行和实现业务逻辑。click 则是用装饰器的方式进一步简化显式的命令调用逻辑,但仍然不够面向对象。 而今天要介绍的 fire则是用一种面向广义对象的方式来玩转命令行,这种对象可以是类、函数、字典、列表等,它更加灵活,也更加简单。 本系列文章默认使用 Python 3 作为解释器进行讲解。若你仍在使用 Python 2,请注意两者之间语法和库的使用差异哦~ 二、介绍fire 可以根据任何 Python 对象自动生成命令行接口。它有如下特性:
通过如下命令可快速安装 fire 库:
三、快速开始回忆下使用 argparse、docopt 和 click 实现命令行程序的步骤:
它们的实现步骤越来越简单,从四步简化到了两步。而今天的主角 fire 只需一步,现业务逻辑就够了。 这简直简单的不可思议,为什么这样做就够了?我们不妨考虑下 Python 中的函数,函数是不是可以对应一个命令行程序,而函数的参数可以对应命令行程序的参数和选项呢?再看看 Python 中的类,一个类是不是可以对应一个命令行程序,而类中的每个实例方法就可以对应子命令,实例方法中的参数就是对应子命令的参数和选项。 这么一想,理论上确实是可以实现的,我们不妨通过下面的示例来看看 fire 是如何让我们通过简单的方式实现命令行程序。 3.1 使用函数来看这么一个例子: import firedef hello(name='World'): return 'Hello {name}!'.format(name=name)if __name__ == '__main__': fire.Fire(hello) 在上述例子中定义一个 hello 函数,它接受 name 参数,并且有默认值 'World'。使用 fire.Fire(hello) 即可非常简单快速地实现命令功能,这个命令行就接受 --name 选项,不提供时使用默认值 'World',提供时就按提供的值来。 可在命令行中执行下列命令:
3.2 使用类使用函数是最简单的方式,如果我们想以更有组织的方式来实现,比如使用类,fire 也是支持的。 import fireclass Calculator(object): '''A simple calculator class.''' def double(self, number): return 2 * number def triple(self, number): return 3 * numberif __name__ == '__main__': fire.Fire(Calculator) 在上述例子中定义一个 Calculator 类,它有两个实例方法 double 和 triple,并且都接受 number 参数,没有默认值。使用 fire.Fire(Calculator) 即可非常简单快速地实现命令功能,这个命令行支持两个子命令 double 和 triple,位置参数 NUMBER 或选项参数 --number 可在命令行中执行下列命令:
四、小结fire 的使用方式非常简单,定一个 Python 对象,剩下的就交给 fire 来处理,可谓是非常的 Pythonic,这也是它会如此受欢迎的原因。 除了上面展示的内容,fire 还支持更多种类的 Python 对象,也拥有很多强大的功能,我们将在接下来几节中逐步走近它。 『讲解开源项目系列』——让对开源项目感兴趣的人不再畏惧、让开源项目的发起者不再孤单。跟着我们的文章,你会发现编程的乐趣、使用和发现参与开源项目如此简单。欢迎留言联系我们、加入我们,让更多人爱上开源、贡献开源~ |
|