4

FastAPI的小兄弟,开发命令行工具更给力

 2 years ago
source link: https://www.kingname.info/2022/03/06/typer/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

FastAPI的小兄弟,开发命令行工具更给力

发表于

2022-03-06

| 分类于 Python

| 评论数: 0

关注我公众号的同学都知道,我非常喜欢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会报错:

20220119182532.png

使用参数--help可以查看这个脚本的命令行参数:

20220119182619.png

于是我们根据这里的提示,输入正确的参数,从而正常运行程序:

20220119182659.png

子命令与自动补全更好用

假设我们有一个神经网络的程序,其中的入口函数代码如下:

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非常方便,只需要加两个装饰器就可以了:

20220119183543.png

运行效果如下图所示:

20220119183621.png

输入具体的子命令,还可以查看每个子命令的参数:

20220119183725.png

因此,我可以使用两个不同的子命令来运行程序:

20220119185959.png

你以为这样就完了?我们再安装它的一个辅助工具typer-cli,还可以做更多事情:

python3 -m pip install typer-cli
typer --install-completion

有了这个东西,我们运行程序可以这样写:

typer example_2.py run 子命令 参数1 参数2 --可选参数1 可选参数1的值

20220119184434.png

并且,typer可以帮我们可以实现自动补全:

输入typer example_2.py run 然后按下Tab键,自动告诉你可以输入哪些子命令,如下图所示:

20220119184218.png

除此之外,如果你的命令行程序只有一个命令,那么你甚至只需要写一个函数,连typer都不需要导入,就可以使用typer来运行:

20220119184837.png

自动生成文档也简单

我们知道,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的软件打开这个文档,可以看到文档内容如下:

20220119185537.png

这样一来,我们不需要额外花心思去维护文档,只需要在修改完代码、增删新的命令或者参数以后,运行这个命令,就可以把文档自动更新。

谢乾坤 | Kingname wechat
第一时间获取最新文章更新,请订阅我的微信公众号:未闻Code

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK