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