當前位置:首頁 > > HelloGitHub


一、前言

在本系列前面所有文章中,我們分別介紹了 argparse、docopt和 click的主要功能和用法。它們各具特色,都能出色地完成命令行任務。argparse是面向過程的,需要先設置解析器,再定義參數(shù),再解析命令行,最后實現(xiàn)業(yè)務邏輯。docopt先用聲明式的語法定義出參數(shù),再過程式地解析命令行和實現(xiàn)業(yè)務邏輯。click則是用裝飾器的方式進一步簡化顯式的命令調用邏輯,但仍然不夠面向對象。

而今天要介紹的 fire則是用一種面向廣義對象的方式來玩轉命令行,這種對象可以是類、函數(shù)、字典、列表等,它更加靈活,也更加簡單。

本系列文章默認使用 Python 3 作為解釋器進行講解。
若你仍在使用 Python 2,請注意兩者之間語法和庫的使用差異哦~

二、介紹

fire 可以根據(jù)任何 Python 對象自動生成命令行接口。它有如下特性:

  • 能以簡單的方式生成 CLI
  • 是一個開發(fā)和調試 Python 代碼的實用工具
  • 能將現(xiàn)存代碼或別人的代碼轉換為 CLI
  • 使得在 Bash 和 Python 間的轉換變得更容易
  • 通過預先為 REPL 設置所需的模塊和變量,使得實用 REPL 更加容易

通過如下命令可快速安裝 fire庫:

pip install fire

三、快速開始

回憶下使用 argparse、docopt和 click實現(xiàn)命令行程序的步驟:

  • 對于 argparse來說,要先設置解析器,再定義參數(shù),再解析命令行,最后實現(xiàn)業(yè)務邏輯(四步)
  • 對于 docopt來說,要先定義定義接口描述,再解析命令行,最后實現(xiàn)業(yè)務邏輯(三步)
  • 對于 click來說,就是實現(xiàn)業(yè)務邏輯和通過裝飾器的方式定義參數(shù)(兩步)

它們的實現(xiàn)步驟越來越簡單,從四步簡化到了兩步。而今天的主角 fire只需一步,現(xiàn)業(yè)務邏輯就夠了。

這簡直簡單的不可思議,為什么這樣做就夠了?我們不妨考慮下 Python 中的函數(shù),函數(shù)是不是可以對應一個命令行程序,而函數(shù)的參數(shù)可以對應命令行程序的參數(shù)和選項呢?再看看 Python 中的類,一個類是不是可以對應一個命令行程序,而類中的每個實例方法就可以對應子命令,實例方法中的參數(shù)就是對應子命令的參數(shù)和選項。

這么一想,理論上確實是可以實現(xiàn)的,我們不妨通過下面的示例來看看 fire是如何讓我們通過簡單的方式實現(xiàn)命令行程序。

3.1 使用函數(shù)

來看這么一個例子:

import fire def hello(name="World"): return 'Hello {name}!'.format(name=name) if __name__ == '__main__':
  fire.Fire(hello)

在上述例子中定義一個 hello函數(shù),它接受 name參數(shù),并且有默認值 "World"。使用 fire.Fire(hello)即可非常簡單快速地實現(xiàn)命令功能,這個命令行就接受 --name選項,不提供時使用默認值 "World",提供時就按提供的值來。

可在命令行中執(zhí)行下列命令:

$ 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.pyFLAGS
    --name=NAME

3.2 使用類

使用函數(shù)是最簡單的方式,如果我們想以更有組織的方式來實現(xiàn),比如使用類,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參數(shù),沒有默認值。使用 fire.Fire(Calculator)即可非常簡單快速地實現(xiàn)命令功能,這個命令行支持兩個子命令 double和 triple,位置參數(shù) NUMBER或選項參數(shù) --number

可在命令行中執(zhí)行下列命令:

$ 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 對象,也擁有很多強大的功能,我們將在接下來幾節(jié)中逐步走近它。

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
關閉