文章插图
【Google 开源的 Python 命令行库:初探 fire】
作者:HelloGitHub-Prodesire
一、前言在本系列前面所有文章中 , 我们分别介绍了 argparse、docopt 和 click 的主要功能和用法 。它们各具特色 , 都能出色地完成命令行任务 。argparse 是面向过程的 , 需要先设置解析器 , 再定义参数 , 再解析命令行 , 最后实现业务逻辑 。docopt 先用声明式的语法定义出参数 , 再过程式地解析命令行和实现业务逻辑 。click 则是用装饰器的方式进一步简化显式的命令调用逻辑 , 但仍然不够面向对象 。
而今天要介绍的 fire则是用一种面向广义对象的方式来玩转命令行 , 这种对象可以是类、函数、字典、列表等 , 它更加灵活 , 也更加简单 。
本系列文章默认使用 Python 3 作为解释器进行讲解 。若你仍在使用 Python 2 , 请注意两者之间语法和库的使用差异哦~
二、介绍fire 可以根据任何 Python 对象自动生成命令行接口 。它有如下特性:- 能以简单的方式生成 CLI
- 是一个开发和调试 Python 代码的实用工具
- 能将现存代码或别人的代码转换为 CLI
- 使得在 Bash 和 Python 间的转换变得更容易
- 通过预先为 REPL 设置所需的模块和变量 , 使得实用 REPL 更加容易
pip install fire
三、快速开始回忆下使用 argparse、docopt 和 click 实现命令行程序的步骤:- 对于 argparse 来说 , 要先设置解析器 , 再定义参数 , 再解析命令行 , 最后实现业务逻辑(四步)
- 对于 docopt 来说 , 要先定义定义接口描述 , 再解析命令行 , 最后实现业务逻辑(三步)
- 对于 click 来说 , 就是实现业务逻辑和通过装饰器的方式定义参数(两步)
这简直简单的不可思议 , 为什么这样做就够了?我们不妨考虑下 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" , 提供时就按提供的值来 。可在命令行中执行下列命令:
$ python hello.pyHello World!$ python hello.py --name=ProdesireHello Prodesire!$ python hello.py --helpINFO: Showing help with the command 'hello.py -- --help'.NAMEhello.pySYNOPSIShello.py <flags>FLAGS--name=NAME
3.2 使用类使用函数是最简单的方式 , 如果我们想以更有组织的方式来实现 , 比如使用类 , fire 也是支持的 。import fireclass Calculator(object):"""A simple calculator class."""def double(self, number):return 2 * numberdef triple(self, number):return 3 * numberif __name__ == '__main__':fire.Fire(Calculator)
在上述例子中定义一个 Calculator 类 , 它有两个实例方法 double 和 triple , 并且都接受 number 参数 , 没有默认值 。使用 fire.Fire(Calculator) 即可非常简单快速地实现命令功能 , 这个命令行支持两个子命令 double 和 triple , 位置参数 NUMBER 或选项参数 --number可在命令行中执行下列命令:
$ python calculator.py double 1020$ python calculator.py triple --number=1545$ python calculator.py double --helpINFO: Showing help with the command 'calculator.py double -- --help'.NAMEcalculator.py doubleSYNOPSIScalculator.py double NUMBERPOSITIONAL ARGUMENTSNUMBERNOTESYou can also use flags syntax for POSITIONAL ARGUMENTS
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 如何提高WordPress的网站安全
- 网络交换机的简单知识
- 肉桂红茶,喝肉桂红茶的好处
- 浓缩精华的架构演进过程
- 微信号什么样的情况下会被封号?国外微信怎么辅助解封
- 荷叶茶禁忌,冲泡荷叶茶的禁忌
- 小程序的5大特点、10大优势及6大价值
- 红茶菌功效,莲子心的功效与作用
- 搜索于小程序的重要性,小程序在线直播?
- 铁观音茶叶样子,铁观音茶叶泡开后的样子