涉及的示例代碼和歷史文章,已同步更新到 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 對象,也擁有不少強大的功能,咱們將在接下來幾節中逐步走近它。
『講解開源項目系列』——讓對開源項目感興趣的人再也不畏懼、讓開源項目的發起者再也不孤單。跟着咱們的文章,你會發現編程的樂趣、使用和發現參與開源項目如此簡單。歡迎留言聯繫咱們、加入咱們,讓更多人愛上開源、貢獻開源~