前言
來啦老鐵!
又到了學(xué)習(xí)的時(shí)間啦讯嫂,今天來學(xué)點(diǎn)最近公司大佬提到的一個(gè)小知識(shí)點(diǎn),它就是 Python 的:
-
Fire 庫曾撤。
當(dāng)然端姚,目的不是在精通(做不到也沒必要),而是學(xué)習(xí)其基本用法和便利之處挤悉。
整體步驟
- 簡單介紹一下 Fire渐裸;
- 先簡單 Demo 相似模塊: argparse;
- 安裝 fire 模塊装悲;
- 逐個(gè)使用函數(shù)昏鹃;
- 函數(shù)的鏈?zhǔn)秸{(diào)用;
- 參數(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
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
當(dāng)然,現(xiàn)在還只能一個(gè)函數(shù)一個(gè)函數(shù)調(diào)用傀顾,無法做到鏈?zhǔn)秸{(diào)用的效果襟铭,如:
python3 demo.py - add 3 4 - multiply 4 5
當(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
- 再如:
python3 main.py --init_number=8 - add 4 - divide 2
- 則命令行輸出:6.0
- 再如我們?cè)谏厦娴幕A(chǔ)上再將結(jié)果轉(zhuǎn)為整數(shù):
python3 main.py --init_number=8 - add 4 - divide 2 - to_integer
- 則命令行輸出: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)
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)贊圾浅?
非常感謝!