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

Click应用api命令动态Shell补全:保留原有选项并追加动态选项

解决方案:Click动态API命令的选项补全实现

核心思路

通过重写Click命令类的补全方法,在保留原有选项补全能力的基础上,动态注入对应SDK方法的参数选项补全。无需复杂的猴子补丁,直接利用Click提供的get_completions扩展点即可实现需求。

具体实现步骤

1. 自定义命令类并重写补全逻辑

创建继承自click.Command的类,重写get_completions方法,实现原有补全与动态参数补全的合并:

import click
from your_sdk_utils import get_method_required_params  # 替换为实际获取SDK方法参数的函数

class DynamicAPICommand(click.Command):
    def get_completions(self, ctx, incomplete):
        # 先获取原有Click管理选项的补全结果(如--output、--auth-token等)
        original_completions = list(super().get_completions(ctx, incomplete))
        
        # 从已输入参数中解析当前指定的METHOD
        method_name = None
        for arg in ctx.args:
            if not arg.startswith('--'):
                method_name = arg
                break
        
        # 若已指定METHOD,生成对应动态参数的补全项
        if method_name:
            # 调用工具函数获取该SDK方法的参数列表,格式如['--username', '--user-id']
            method_params = get_method_required_params(method_name)
            for param in method_params:
                if param.startswith(incomplete):
                    original_completions.append(click.CompletionItem(param))
        
        return original_completions

2. 用自定义类注册api命令

替换原有的@click.command装饰器,使用自定义命令类,并保留原有配置与选项:

@click.command(
    cls=DynamicAPICommand,
    context_settings=dict(
        ignore_unknown_options=True,
        allow_extra_args=True
    )
)
@click.argument('METHOD', shell_complete=your_existing_method_completer)  # 保留原有的METHOD补全逻辑
@click.option('--output', help='输出格式', type=click.Choice(['json', 'yaml']))  # 原有全局选项
@click.option('--auth-token', help='认证Token')  # 原有全局选项
def api(ctx, method):
    # 原有的业务逻辑:解析动态参数并调用对应SDK方法
    pass

3. 生成并配置Shell补全脚本

Click默认的补全生成工具会自动调用重写后的get_completions方法,只需正常生成对应Shell的补全脚本即可:

# Bash补全脚本生成示例
progname completion bash > /etc/bash_completion.d/progname

# Zsh补全脚本生成示例
progname completion zsh > ~/.zsh/completions/_progname

关键细节说明

  • METHOD参数解析:通过遍历ctx.args定位第一个非选项参数作为METHOD,确保补全时能准确匹配当前要调用的SDK方法
  • 动态参数来源:需实现get_method_required_params函数,通过反射SDK类的方法签名或预定义的参数映射,获取对应方法的参数选项列表
  • 补全准确性:仅保留以输入前缀incomplete开头的动态参数,避免无效补全项干扰用户输入
  • 原有功能兼容:通过super().get_completions获取原有选项的补全结果,完全保留Click原生选项的补全能力

内容的提问来源于stack exchange,提问作者thomas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 10:05:16