628 字
3 分钟
组织Python CLI应用的结构
正确地组织CLI应用的结构能够很好的将不同类型的函数分离,从而方便多人共同合作并能够简单地实现功能的上下线。使用 argparse 这个内置模块来组织Python应用的结构显然是不现实的,因为 argparse 的解析器构建不区分子命令与参数,同时显式创建的方式也不利于函数分离。要构建一个现代的CLI应用,使用 Typer 是必要的。
业务代码与逻辑代码
一般来说,业务代码应当与逻辑代码分开存放,业务代码是指真正实现功能的代码,逻辑代码是指实现判断、循环、嵌套的代码。例子如下:
if name: say_hello(name)
def say_hello(name): print("Hello " + name + " nice to meet you.")这里的 say_hello 即为业务函数(代码),而 if 后面的判断则为逻辑代码。在这里业务与逻辑代码存放在一个文件中,但在真实的应用开发中,业务代码与逻辑代码应当是存放在两个不同位置,在逻辑代码需要用到的时候导入。分离业务与逻辑代码有诸多好处:使项目文件更清晰、使逻辑部分更简洁易懂、便于多人协作等。
在我开发的项目中,项目通常被组织为:
src/└── python_project/ ├── commands/ │ └── command_function.py ├── __init__.py #项目构建为包使用时的入口 ├── __main__.py #项目构建为应用时使用的入口 ├── business_function.py └── utils.py由于Python默认使用 main.py 或 __main__.py 作为主函数入口, Typer 创建命令的起始位置只能放在此处。但当应用的子命令过多时,有必要将真实的子命令定义(即逻辑函数)与应用入口分离。为了结构清晰,逻辑代码通常被保存在 commands/ 下面,业务函数则是直接平铺在 python_project 下面。对于与单个逻辑函数强相关的业务函数,可以经过恰当的命名后直接平铺,如果是能在多个业务函数或逻辑函数中使用的小工具函数则可以保存在 utils.py 中。
不少Python项目是可以同时作为应用程序与包来使用的, __init__,py 是Python包的默认函数入口,其写法如下:
from .business_function import function1from .utils import util在 __init__.py 中导入的函数会被暴露在外部供用户使用。
from python_project import function1 组织Python CLI应用的结构
https://blog.lancersoul.top/posts/uv-project-structure/