FastAPI 的小兄弟,開發命令行工具更給力
攝影:產品經理
嘎嘣脆的魚子醬
關注我公衆號的同學都知道,我非常喜歡 FastAPI 這個 web 框架。它在易用性上面做到了極致,幫助開發者減少了很多不必要的工作。
FastAPI 的開發組織叫做tiangolo
,他家除了 FastAPI 外,還有另一個項目也非常好用,叫做typer
。
三年前,我寫過一篇文章一日一技:快速實現 Python 命令行參數介紹另一個命令行工具 fire. 而typer
做得比 fire 還要好。
首先使用 pip 來安裝它:
python3 -m pip install typer
函數參數等於命令行參數
我們首先來看看 typer 怎麼使用。創建一個example_1.py
文件,寫入如下代碼。
import typer
def main(name: str, salary: int):
print(f'{name}月薪{salary}元')
if __name__ == '__main__':
typer.run(main)
直接運行,Python 會報錯:
使用參數--help
可以查看這個腳本的命令行參數:
於是我們根據這裏的提示,輸入正確的參數,從而正常運行程序:
子命令與自動補全更好用
假設我們有一個神經網絡的程序,其中的入口函數代碼如下:
def train_data(train_folder: str, test_folder: str, rate: float = 0.8):
"""
訓練人臉檢測模型
"""
print(f'使用文件夾{train_folder}中的數據進行訓練')
print(f'使用{test_folder}中的數據用來驗證訓練效果,確保準確率>{rate}')
return True
def predict(folder: str):
"""
使用訓練好的模型預測
"""
print(f'對文件夾{folder}中的數據進行預測。')
顯然,這個程序可以用來訓練數據,也可以用來預測數據,所以有兩種不同的命令,每一種命令有不同的參數。
這種情況下,使用 typer 非常方便,只需要加兩個裝飾器就可以了:
運行效果如下圖所示:
輸入具體的子命令,還可以查看每個子命令的參數:
因此,我可以使用兩個不同的子命令來運行程序:
你以爲這樣就完了?我們再安裝它的一個輔助工具typer-cli
,還可以做更多事情:
python3 -m pip install typer-cli
typer --install-completion
有了這個東西,我們運行程序可以這樣寫:
typer example_2.py run 子命令 參數1 參數2 --可選參數1 可選參數1的值
例如:
並且,typer 可以幫我們可以實現自動補全:
輸入typer example_2.py run
然後按下Tab
鍵,自動告訴你可以輸入哪些子命令,如下圖所示:
除此之外,如果你的命令行程序只有一個命令,那麼你甚至只需要寫一個函數,連 typer 都不需要導入,就可以使用 typer 來運行:
自動生成文檔也簡單
我們知道,FastAPI 自動生成接口文檔的功能非常好用。typer 作爲它的兄弟,也繼承了這個高級功能。我們來看看:
import typer
app = typer.Typer(help="人臉檢測模型")
@app.command()
def train_data(train_folder: str, test_folder: str, rate: float = 0.8):
"""
訓練人臉檢測模型
"""
print(f'使用文件夾{train_folder}中的數據進行訓練')
print(f'使用{test_folder}中的數據用來驗證訓練效果,確保準確率>{rate}')
return True
@app.command()
def predict(folder: str):
"""
使用訓練好的模型預測
"""
print(f'對文件夾{folder}中的數據進行預測。')
運行命令:
typer main.py utils docs --name "python3 main.py" --output readme.md
自動在當前文件夾生成一個readme.md
文件。我們使用任何能夠渲染 Markdown 的軟件打開這個文檔,可以看到文檔內容如下:
這樣一來,我們不需要額外花心思去維護文檔,只需要在修改完代碼、增刪新的命令或者參數以後,運行這個命令,就可以把文檔自動更新。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/qYcXvp1pU2mfmbITL_StvA