推荐一个 FastAPI 的小兄弟,开发命令行工具更给力!
共 1856字,需浏览 4分钟
·
2022-05-20 16:20
大家好,我是安果!
关注我公众号的同学都知道,我非常喜欢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 会报错:
使用参数--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的软件打开这个文档
可以看到文档内容如下:
这样一来,我们不需要额外花心思去维护文档,只需要在修改完代码、增删新的命令或者参数以后,运行这个命令,就可以把文档自动更新