涉及的示例代码和历史文章,已同步更新到 HelloGitHub-Team 仓库python
在本系列前面全部文章中,咱们分别介绍了 argparse
、docopt
和 click
的主要功能和用法。它们各具特点,都能出色地完成命令行任务。argparse
是面向过程的,须要先设置解析器,再定义参数,再解析命令行,最后实现业务逻辑。docopt
先用声明式的语法定义出参数,再过程式地解析命令行和实现业务逻辑。click
则是用装饰器的方式进一步简化显式的命令调用逻辑,但仍然不够面向对象。git
而今天要介绍的 fire 则是用一种面向广义对象的方式来玩转命令行,这种对象能够是类、函数、字典、列表等,它更加灵活,也更加简单。github
本系列文章默认使用 Python 3 做为解释器进行讲解。
若你仍在使用 Python 2,请注意二者之间语法和库的使用差别哦~
复制代码
fire 能够根据任何 Python 对象自动生成命令行接口。它有以下特性:编程
经过以下命令可快速安装 fire
库:bash
pip install fire
复制代码
回忆下使用 argparse
、docopt
和 click
实现命令行程序的步骤:函数
argparse
来讲,要先设置解析器,再定义参数,再解析命令行,最后实现业务逻辑(四步)docopt
来讲,要先定义定义接口描述,再解析命令行,最后实现业务逻辑(三步)click
来讲,就是实现业务逻辑和经过装饰器的方式定义参数(两步)它们的实现步骤愈来愈简单,从四步简化到了两步。而今天的主角 fire
只需一步,现业务逻辑就够了。工具
这简直简单的难以想象,为何这样作就够了?咱们不妨考虑下 Python 中的函数,函数是否是能够对应一个命令行程序,而函数的参数能够对应命令行程序的参数和选项呢?再看看 Python 中的类,一个类是否是能够对应一个命令行程序,而类中的每一个实例方法就能够对应子命令,实例方法中的参数就是对应子命令的参数和选项。ui
这么一想,理论上确实是能够实现的,咱们不妨经过下面的示例来看看 fire
是如何让咱们经过简单的方式实现命令行程序。google
来看这么一个例子:spa
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.py <flags>
FLAGS
--name=NAME
复制代码
使用函数是最简单的方式,若是咱们想以更有组织的方式来实现,好比使用类,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 对象,也拥有不少强大的功能,咱们将在接下来几节中逐步走近它。
『讲解开源项目系列』——让对开源项目感兴趣的人再也不畏惧、让开源项目的发起者再也不孤单。跟着咱们的文章,你会发现编程的乐趣、使用和发现参与开源项目如此简单。欢迎留言联系咱们、加入咱们,让更多人爱上开源、贡献开源~