当前位置:首页>python>SpaceWorld:用一行装饰器,让 Python 函数秒变专业 CLI 工具

SpaceWorld:用一行装饰器,让 Python 函数秒变专业 CLI 工具

  • 2026-10-11 08:27:58
SpaceWorld:用一行装饰器,让 Python 函数秒变专业 CLI 工具

什么是 SpaceWorld

SpaceWorld 是一个新一代的 Python CLI(命令行接口)框架,专为团队便捷开发而设计,要求 Python 3.12 及以上版本,并支持异步命令。它的核心设计理念是让命令行工具的编写尽可能简洁——开发者只需用普通的 Python 函数,加上装饰器,就能快速生成功能完备的命令行应用。

核心特性

SpaceWorld 具备以下几项关键特性:

最高速度:专为高负载应用优化,性能表现出色

高度灵活:支持自定义处理器、命令和模块

代码简洁:业务逻辑就是普通函数,框架自动处理命令行解析

**支持 *args 和 kwargs:灵活接收任意数量的参数

扩展类型注解:支持 Annotated、Literal、Union 等新式类型标注

内置验证器和转换器:可直接在类型注解中定义参数校验规则

安装

首先创建并激活虚拟环境,然后使用 pip 安装:

pip install spaceworld

基本用法

最简单的例子

from spaceworld import run@rundef main():    print("Hello World")

保存为 main.py,在终端中运行:

$ python main.pyHello World$ python main.py --helpUsage: main [ARGS] [OPTIONS]None documentationOptions:  --help      - Displays the help on the command

只需要一个 @run 装饰器,普通函数就变成了命令行工具,而且自动生成了 --help 帮助文档。

带参数的命令

from spaceworld import run@rundef main(name: str):    print(f"Hello {name}")

运行效果:

$ python main.pyERROR: Missing required argument: 'name'$ python main.py AliceHello Alice

函数参数的类型注解(name: str)被 SpaceWorld 自动识别为命令行参数。如果缺少必填参数,框架会给出清晰的错误提示。

带默认值的参数

from spaceworld import run@rundef main(name: str = "World"):    print(f"Hello {name}")

运行效果:

$ python main.pyHello World$ python main.py AliceHello Alice

有默认值的参数变成可选参数,不传时使用默认值。

异步命令

SpaceWorld 原生支持异步函数,适合需要等待 I/O 操作的场景:

import asynciofrom spaceworld import run@runasync def main(second: int = 1):    await asyncio.sleep(second)    print(f"Hello in {second} second")

运行效果:

$ python main.py sleep 1# 等待 1 秒后输出Hello in 1 second$ python main.py sleep 5# 等待 5 秒后输出Hello in 5 second

async def 定义的函数被 @run 装饰后,框架会自动以异步方式调度执行。

参数验证

SpaceWorld 支持通过 Annotated 类型注解在参数上直接定义验证规则,无需额外编写校验代码:

from typing import Annotatedfrom spaceworld import run@rundef main(    age: Annotated[        int,        lambda x: x if x >= 18 else ValueError("The user must be over 18 years old")    ]):    print(f"Hello {age} year old")

运行效果:

$ python main.py 18Hello 18 year old$ python main.py 15ERROR: Invalid argument for 'age': Error in the Annotated validation for `15`:Arg: 15, Error: The user must be over 18 years old$ python main.py -1ERROR: Invalid argument for 'age': Error in the Annotated validation for `-1`:Arg: -1, Error: The user must be over 18 years old

Annotated 的第一个参数是基础类型(int),第二个参数是一个验证函数,接收输入值并返回有效值或抛出异常。SpaceWorld 会自动应用这些验证规则,并在失败时给出详细的错误信息。

多命令应用

SpaceWorld 支持在一个文件中定义多个子命令:

from spaceworld import run@rundef main():    """主入口"""    pass@main.command()def greet(name: str = "World"):    """打招呼"""    print(f"Hello, {name}!")@main.command()def add(a: int, b: int):    """两数相加"""    print(f"{a} + {b} = {a + b}")

运行效果:

$ python main.py greet AliceHello, Alice!$ python main.py add 3 53 + 5 = 8

参数类型转换

SpaceWorld 会根据类型注解自动转换命令行参数(命令行参数默认是字符串):

from spaceworld import run@rundef main(    count: int,    price: float,    active: bool = True):    """演示类型转换"""    print(f"count: {count} (type: {type(count).__name__})")    print(f"price: {price} (type: {type(price).__name__})")    print(f"active: {active} (type: {type(active).__name__})")

运行效果:

$ python main.py 10 3.14 falsecount: 10 (type: int)price: 3.14 (type: float)active: False (type: bool)

流程图

下面是 SpaceWorld 应用从启动到命令执行的完整运行流程。

命令行参数解析流程

流程说明:

用户输入:在终端中键入 python main.py <args>

装饰器捕获:@run 装饰器拦截 main 函数,接管程序入口

签名解析:框架通过内省机制读取函数的参数名、类型注解和默认值

参数匹配:将命令行参数按位置与函数参数一一对应

默认值处理:未提供的参数若有默认值则自动填充,否则报错

验证校验:带有 Annotated 规则的参数会逐条执行验证逻辑

执行调度:根据函数是同步还是异步选择对应的调用方式

业务执行:运行函数体中的实际代码,输出结果

多命令路由流程

当使用 @main.command() 注册子命令后,框架会先检查第一个参数是否为已知的子命令名称;如果是则路由到对应的子命令处理函数,否则按照主命令的参数规则进行解析。

总结

SpaceWorld 的核心优势在于零样板代码:开发者只需关注业务逻辑,类型注解即接口定义,框架负责命令行解析、类型转换、验证检查和帮助文档生成。它特别适合需要快速构建 CLI 工具的团队项目,尤其是涉及异步 I/O 操作的场景。

编辑:余文彬

审校:余雨馨

最新文章

随机文章