1. 程式人生 > >Google 開源的 Python 命令列庫:初探 fire

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



作者:HelloGitHub-Prodesire

HelloGitHub 的《講解開源專案》系列,專案地址:https://github.com/HelloGitHub-Team/Article

一、前言

在本系列前面所有文章中,我們分別介紹了 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 物件,也擁有很多強大的功能,我們將在接下來幾節中逐步走近它。


『講解開源專案系列』——讓對開源專案感興趣的人不再畏懼、讓開源專案的發起者不再孤單。跟著我們的文章,你會發現程式設計的樂趣、使用和發現參與開源專案如此簡單。歡迎留言聯絡我們、加入我們,讓更多人愛上開源、貢獻開源