Google 開源的 Python 命令行庫:初探 fire

???? Python貓” ,一個值得加星標的公衆號

花下貓語:之前分享過 Python 命令行庫的系列文章,閱讀數據並不樂觀。APScheduler 源碼剖析系列亦如此。認真用心的優質原創,竟是這樣的結果。或許是話題太小衆了吧?不過,我不灰心,仍要繼續分享在公衆號裏。誠然看的人不多,但好東西就值得分享。

劇照 | 《哪吒之魔童降世》

作者:HelloGitHub-Prodesire

一、前言

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

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

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

二、介紹

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

  • 能以簡單的方式生成 CLI

  • 是一個開發和調試 Python 代碼的實用工具

  • 能將現存代碼或別人的代碼轉換爲 CLI

  • 使得在 Bash 和 Python 間的轉換變得更容易

  • 通過預先爲 REPL 設置所需的模塊和變量,使得實用 REPL 更加容易

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

pip install fire

三、快速開始

回憶下使用 argparsedocoptclick 實現命令行程序的步驟:

  • 對於 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 類,它有兩個實例方法 doubletriple,並且都接受 number 參數,沒有默認值。使用 fire.Fire(Calculator) 即可非常簡單快速地實現命令功能,這個命令行支持兩個子命令 doubletriple,位置參數 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 對象,也擁有很多強大的功能,我們將在接下來幾節中逐步走近它。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章