推荐一个 FastAPI 的小兄弟,开发命令行工具更给力!

这是「进击的Coder」的第 646 篇技术分享

作者:kingname

来源:未闻 Code

阅读本文大概需要 5 分钟。

关注我公众号的同学都知道,我非常喜欢 FastAPI 这个 web 框架。它在易用性上面做到了极致,帮助开发者减少了很多不必要的工作。

FastAPI 的开发组织叫做tiangolo,他家除了 FastAPI 外,还有另一个项目也非常好用,叫做typer

首先使用 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 会报错:

dc35e15c22c14cec70bac46f28fed1d7.png

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

6c957005b13314a0251eaadcf48d310a.png

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

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

2e320e404c0c75be28976ed5c4fc7710.png

运行效果如下图所示:

cea54e94614563aebd3fc577ab8445fb.png

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

01749c01df443f419312b172aa63723c.png

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

9cd4ab8e2de7d66d27267f1a80e5fa33.png

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

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

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

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

例如:

1ca2c82a202b37607f34225e1b7edc8e.png

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

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

8c2554ba5b0f2406af0d4cc7c1fb051c.png

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

5e8f4b4325e9c87b9715efe2b8155c2a.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 的软件打开这个文档,可以看到文档内容如下:

a2955e87eaeafff57c858e8c626b7318.png

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

5866f949074e2225ad66ea50c7d7f44d.png

End

图灵 618 举行了“冰点促销”活动,电子书全场 5 折(新书除外),同时活动期间还有满减活动,感兴趣的朋友可以扫码查看!

98e6f8a4cb9e12065f51f0186a54e677.png

cfa9adee76ad05e80812bbeb8f2ac526.png

点个在看你最好看

outside_default.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值