Python 命令行工具庫:Fire

前言

來啦老鐵!

又到了學(xué)習(xí)的時(shí)間啦讯嫂,今天來學(xué)點(diǎn)最近公司大佬提到的一個(gè)小知識(shí)點(diǎn),它就是 Python 的:

  • Fire 庫曾撤。

當(dāng)然端姚,目的不是在精通(做不到也沒必要),而是學(xué)習(xí)其基本用法和便利之處挤悉。

整體步驟

  1. 簡單介紹一下 Fire渐裸;
  2. 先簡單 Demo 相似模塊: argparse;
  3. 安裝 fire 模塊装悲;
  4. 逐個(gè)使用函數(shù)昏鹃;
  5. 函數(shù)的鏈?zhǔn)秸{(diào)用;
  6. 參數(shù)解析功能诀诊;

1. 簡單介紹一下 Fire洞渤;

Python Fire 是 Google 開源的一個(gè)可從任何 Python 代碼自動(dòng)生成命令行接口(CLI)的庫。

  • Python Fire 是一種在 Python 中創(chuàng)建 CLI 的簡單方法属瓣。
  • Python Fire 是開發(fā)和調(diào)試 Python 代碼的有用工具载迄。
  • Python Fire 幫助探索現(xiàn)有代碼或?qū)⑵渌说拇a轉(zhuǎn)換為CLI。
  • Python Fire 使 Bash 和 Python 之間的轉(zhuǎn)換更為容易抡蛙。
  • Python Fire 通過使用你需要導(dǎo)入和創(chuàng)建的模塊和變量來設(shè)置 REPL护昧,使得使用 Python REPL 更容易。
    (摘抄自:https://www.oschina.net/p/python-fire?hmsr=aladdin1e1

讓我不禁想到另一個(gè)之前用過的一個(gè)生成命令行參數(shù)的模塊:argparse粗截,下面先來簡單 Demo 一下 argparse 模塊惋耙;

2. 先簡單 Demo 相似模塊: argparse;

  • 直接上代碼(本 Demo 文件名為 argparseDemo.py):
import argparse


def test():
    parser = argparse.ArgumentParser()
    parser.add_argument("-n", "--name", default=0)
    args = parser.parse_args()
    print(f"Hello {args.name} !")


if __name__ == '__main__':
    test()

  • 演示:
python3 argparseDemo.py --name=dylan

或:

python3 argparseDemo.py -n=dylan
  • 則命令行輸出:
命令行輸出

我們看到 name 參數(shù)傳到 test() 方法了,也就做到 REPL 的效果了绽榛,不過可想而知湿酸,如果要對(duì)傳入的不同參數(shù),做不同的邏輯處理灭美,則需要寫很多邏輯判斷語句推溃,代碼應(yīng)該不會(huì)很“整潔”~
而 fire 模塊在這方面就顯得很不一樣了,接下來我們來學(xué)學(xué) fire 模塊冲粤。

3. 安裝 fire 模塊美莫;

pip3 install fire

4. 逐個(gè)使用函數(shù);

1). 單個(gè)函數(shù)梯捕;

  • 代碼:
import fire


def add(first_number, second_number):
    return first_number + second_number


if __name__ == '__main__':
    fire.Fire()

  • 演示:
python3 demo.py - add 3 4

或:

python3 demo.py - add --first_number=3 --second_number=4
  • 則命令行輸出:7
則命令行輸出:7

2). 多個(gè)函數(shù)厢呵;

  • 代碼:
import fire


def add(first_number, second_number):
    return first_number + second_number


def subtract(first_number, second_number):
    return first_number - second_number


def multiply(first_number, second_number):
    return first_number * second_number


def divide(first_number, second_number):
    return first_number / second_number


if __name__ == '__main__':
    fire.Fire()

  • 演示:
python3 demo.py - multiply 4 5

或:

python3 demo.py - multiply --first_number=4 --second_number=5
  • 則命令行輸出:20
則命令行輸出:20

當(dāng)然,現(xiàn)在還只能一個(gè)函數(shù)一個(gè)函數(shù)調(diào)用傀顾,無法做到鏈?zhǔn)秸{(diào)用的效果襟铭,如:

python3 demo.py - add 3 4 - multiply 4 5
鏈?zhǔn)秸{(diào)用報(bào)錯(cuò)

當(dāng)然,fire 是能夠做到函數(shù)的鏈?zhǔn)秸{(diào)用的短曾,只是要稍微處理一下寒砖,請(qǐng)往下閱讀~

5. 函數(shù)的鏈?zhǔn)秸{(diào)用;

  • 代碼:
import fire


class Calculator(object):
    def __init__(self, init_number):
        self.init_number = init_number
        self.result = self.init_number

    def __str__(self):
        return str(self.result)

    def add(self, number):
        self.result = self.result + number
        return self

    def subtract(self, number):
        self.result = self.result - number
        return self

    def multiply(self, number):
        self.result = self.result * number
        return self

    def divide(self, number):
        self.result = self.result / number
        return self

    def to_integer(self):
        self.result = int(self.result)
        return self


if __name__ == '__main__':
    fire.Fire(Calculator)

1). 函數(shù)鏈?zhǔn)秸{(diào)用演示嫉拐;

  • 演示:
python3 main.py --init_number=8 - add 4 - multiply 3
  • 則命令行輸出:36
命令行輸出:36
  • 再如:
python3 main.py --init_number=8 - add 4 - divide 2
  • 則命令行輸出:6.0
則命令行輸出:6.0
  • 再如我們?cè)谏厦娴幕A(chǔ)上再將結(jié)果轉(zhuǎn)為整數(shù):
python3 main.py --init_number=8 - add 4 - divide 2 - to_integer
  • 則命令行輸出:6
命令行輸出:6

2). 函數(shù)帶可變參數(shù)鏈?zhǔn)秸{(diào)用演示哩都;

  • 代碼:
import fire


class Calculator(object):
    def __init__(self, init_number):
        self.init_number = init_number
        self.result = self.init_number

    def __str__(self):
        return str(self.result)

    def add(self, number):
        self.result = self.result + number
        return self

    def subtract(self, number):
        self.result = self.result - number
        return self

    def multiply(self, number):
        self.result = self.result * number
        return self

    def divide(self, number):
        self.result = self.result / number
        return self

    def to_integer(self):
        self.result = int(self.result)
        return self

    def batch_add(self, *numbers):
        self.result += sum(numbers)
        return self


if __name__ == '__main__':
    fire.Fire(Calculator)

  • 演示:
python3 main.py --init_number=8 - add 4 - divide 2 - to_integer - batch_add 1 3 4 6
  • 則命令行輸出:20
    (因?yàn)?batch_add 方法可以傳遞多個(gè)值,且 batch_add 實(shí)際上是將所有傳遞進(jìn)方法的參數(shù)累加到 self.result 變量中去婉徘,因此此處為:6 + 1 + 3 + 4 + 6 = 20)
命令行輸出:20

6. 參數(shù)解析功能漠嵌;

  • 代碼:
import fire


def test_type():
    return lambda obj: type(obj).__name__


if __name__ == '__main__':
    fire.Fire(test_type())

  • 演示:
python3 example.py --obj=10

或(后續(xù)例子不再重復(fù)介紹):

python3 example.py 10

控制臺(tái)輸出:int

python3 example.py --obj="10"

控制臺(tái)輸出:int

python3 example.py --obj=\"10\"

控制臺(tái)輸出:str

python3 example.py --obj=True

控制臺(tái)輸出:bool

python3 example.py --obj='{"name":"dylan"}'

控制臺(tái)輸出:dict

可見,fire 模塊的功能比 argparse 強(qiáng)大得多盖呼,用起來也更為順手儒鹿,代碼也十分優(yōu)雅,你 get 到了嗎几晤?

好了约炎,今天我們就到這兒吧,有興趣的朋友不妨練練手~

如果本文對(duì)您有幫助蟹瘾,麻煩動(dòng)動(dòng)手指點(diǎn)點(diǎn)贊圾浅?

非常感謝!

本文參考憾朴、借鑒的文獻(xiàn):
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末狸捕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子伊脓,更是在濱河造成了極大的恐慌府寒,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件报腔,死亡現(xiàn)場(chǎng)離奇詭異株搔,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)纯蛾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門纤房,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人翻诉,你說我怎么就攤上這事炮姨。” “怎么了碰煌?”我有些...
    開封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵舒岸,是天一觀的道長。 經(jīng)常有香客問我芦圾,道長蛾派,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任个少,我火速辦了婚禮洪乍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘夜焦。我一直安慰自己壳澳,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開白布茫经。 她就那樣靜靜地躺著巷波,像睡著了一般。 火紅的嫁衣襯著肌膚如雪科平。 梳的紋絲不亂的頭發(fā)上褥紫,一...
    開封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音瞪慧,去河邊找鬼髓考。 笑死,一個(gè)胖子當(dāng)著我的面吹牛弃酌,可吹牛的內(nèi)容都是我干的氨菇。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼妓湘,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼查蓉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起榜贴,我...
    開封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤豌研,失蹤者是張志新(化名)和其女友劉穎妹田,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鹃共,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鬼佣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了霜浴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晶衷。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖阴孟,靈堂內(nèi)的尸體忽然破棺而出晌纫,到底是詐尸還是另有隱情,我是刑警寧澤永丝,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布锹漱,位于F島的核電站,受9級(jí)特大地震影響慕嚷,放射性物質(zhì)發(fā)生泄漏凌蔬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一闯冷、第九天 我趴在偏房一處隱蔽的房頂上張望砂心。 院中可真熱鬧,春花似錦蛇耀、人聲如沸辩诞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽译暂。三九已至,卻和暖如春撩炊,著一層夾襖步出監(jiān)牢的瞬間外永,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來泰國打工拧咳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留伯顶,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓骆膝,卻偏偏與公主長得像祭衩,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子阅签,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354