You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Typer中根据运行时条件动态切换子命令及对应参数?

如何在Typer中根据运行时条件动态切换子命令及对应参数?

当然可以实现这种动态切换的需求!Typer虽然主要靠静态装饰器定义命令,但我们可以借助它的上下文机制和动态注册能力,在运行时根据实际条件加载对应的子命令和参数。我给你调整一下示例代码,完美实现你想要的效果:

import typer
from typing import Annotated, Optional

def is_local(username: str) -> bool:
    # 这里替换成你实际的判断逻辑,比如检查本地用户数据库
    return username.startswith("local_")

# 先定义好两种场景下的处理函数,不用提前装饰成命令
def local_define(address: Annotated[str, typer.Argument()]):
    print(f"执行本地用户配置:地址 = {address}")

def remote_define(url: Annotated[str, typer.Argument()],
                  platform: Annotated[str, typer.Argument()]):
    print(f"执行远程用户配置:URL = {url},平台 = {platform}")

def user_callback(ctx: typer.Context,
                  username: Annotated[str, typer.Argument()]):
    typer.echo(f"当前操作用户:{username}")
    
    # 获取当前的users_app实例(也就是ctx.parent指向的Typer对象)
    users_app = ctx.parent.command
    
    # 移除已有的define命令(避免冲突,也可以用pop只移除指定命令)
    users_app.commands.pop("define", None)
    
    # 根据用户类型动态注册对应的define命令
    if is_local(username):
        users_app.command("define")(local_define)
    else:
        users_app.command("define")(remote_define)

app = typer.Typer()
users_app = typer.Typer(callback=user_callback)
app.add_typer(users_app, name="user")

if __name__ == "__main__":
    app()

关键逻辑说明

  1. 动态注册时机:在user_callback中拿到用户名后,再根据用户类型注册对应的命令。这时候Typer还没开始解析后续的参数,刚好能识别到新注册的命令参数。
  2. 命令清理:用pop("define", None)移除默认的define命令(如果有的话),避免新旧命令冲突。如果有多个动态子命令,也可以批量处理。
  3. 函数复用:把本地和远程的处理逻辑写成普通函数,在需要的时候再用users_app.command()装饰注册,灵活度拉满。

测试效果

当你执行本地用户命令时:

user local_user define "192.168.1.100"

输出:

当前操作用户:local_user
执行本地用户配置:地址 = 192.168.1.100

执行远程用户命令时:

user remote_user define "https://api.example.com" "aws"

输出:

当前操作用户:remote_user
执行远程用户配置:URL = https://api.example.com,平台 = aws

替代方案(如果动态注册不适用)

如果因为某些限制不能用动态注册,也可以用条件参数校验的方式:

  • 把所有可能的参数都定义为可选,然后在命令函数中根据用户类型判断哪些参数是必填的,不符合就抛出错误。但这种方式会让CLI的帮助信息显得混乱,用户体验不如动态切换好。

总的来说,动态注册命令的方式是最贴合你需求的,既保持了CLI的简洁直观,又能实现运行时的动态逻辑。

备注:内容来源于stack exchange,提问作者Joma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 11:19:30