作者:HelloGitHub-Prodesire
一、前言
在本系列前面所有文章中,我們分別介紹了 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.py <flags>
FLAGS
--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 對象,也擁有很多強大的功能,我們將在接下來幾節中逐步走近它。
『講解開源項目系列』——讓對開源項目感興趣的人不再畏懼、讓開源項目的發起者不再孤單。跟著我們的文章,你會發現編程的樂趣、使用和發現參與開源項目如此簡單。歡迎留言聯系我們、加入我們,讓更多人愛上開源、貢獻開源~