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

做者:HelloGitHub- Prodesire

涉及的示例代碼和歷史文章,已同步更新到 HelloGitHub-Team 倉庫python

1、前言

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

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

本系列文章默認使用 Python 3 做爲解釋器進行講解。
若你仍在使用 Python 2,請注意二者之間語法和庫的使用差別哦~
複製代碼

2、介紹

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

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

經過以下命令可快速安裝 fire 庫:bash

pip install fire
複製代碼

3、快速開始

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

  • 對於 argparse 來講,要先設置解析器,再定義參數,再解析命令行,最後實現業務邏輯(四步)
  • 對於 docopt 來講,要先定義定義接口描述,再解析命令行,最後實現業務邏輯(三步)
  • 對於 click 來講,就是實現業務邏輯和經過裝飾器的方式定義參數(兩步)

它們的實現步驟愈來愈簡單,從四步簡化到了兩步。而今天的主角 fire 只需一步,現業務邏輯就夠了。工具

這簡直簡單的難以想象,爲何這樣作就夠了?咱們不妨考慮下 Python 中的函數,函數是否是能夠對應一個命令行程序,而函數的參數能夠對應命令行程序的參數和選項呢?再看看 Python 中的類,一個類是否是能夠對應一個命令行程序,而類中的每一個實例方法就能夠對應子命令,實例方法中的參數就是對應子命令的參數和選項。ui

這麼一想,理論上確實是能夠實現的,咱們不妨經過下面的示例來看看 fire 是如何讓咱們經過簡單的方式實現命令行程序。google

3.1 使用函數

來看這麼一個例子: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
複製代碼

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
複製代碼

4、小結

fire 的使用方式很是簡單,定一個 Python 對象,剩下的就交給 fire 來處理,可謂是很是的 Pythonic,這也是它會如此受歡迎的緣由。

除了上面展現的內容,fire 還支持更多種類的 Python 對象,也擁有不少強大的功能,咱們將在接下來幾節中逐步走近它。


『講解開源項目系列』——讓對開源項目感興趣的人再也不畏懼、讓開源項目的發起者再也不孤單。跟着咱們的文章,你會發現編程的樂趣、使用和發現參與開源項目如此簡單。歡迎留言聯繫咱們、加入咱們,讓更多人愛上開源、貢獻開源~

相關文章
相關標籤/搜索