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

如何在Python中调用@Click并传入非Click来源的参数?

解决方案

要同时实现通过Click接收CLI参数,以及传入非CLI的字典/列表参数,核心思路是拆分核心逻辑与CLI命令逻辑,或者利用Click的上下文传递额外参数,以下是具体实现方式:

方式一:拆分核心逻辑(推荐)

把业务逻辑抽成独立的普通函数,Click命令函数仅负责接收CLI参数,并调用核心函数时传入预先准备好的非CLI参数(比如你的response_dict)。

修改后的代码示例:

import click
import json

# 核心逻辑函数:处理字典和md5参数
def find_pr_id_core(response, md5hash_passed):
    for item in response["values"]:
        fromref = item["fromRef"]
        if fromref["latestCommit"] == md5hash_passed:
            return item["id"]
    return None

# 预先获取response_dict(比如从API请求解析)
# response = your_api_request()
response_dict = json.loads(response.text)

# Click CLI命令函数
@click.command()
@click.argument("md5hash_passed")
def cli_run(md5hash_passed):
    pr_id = find_pr_id_core(response_dict, md5hash_passed)
    if pr_id:
        click.echo(pr_id)  # CLI输出结果
    else:
        click.echo("未匹配到对应的PR ID")

if __name__ == "__main__":
    # 从CLI调用时执行Click命令
    cli_run()
    
    # 脚本内部调用核心函数时,可直接传入自定义参数
    # custom_response = {"values": [...]}
    # print(find_pr_id_core(custom_response, "your-md5-hash"))

方式二:利用Click上下文传递参数

如果不想拆分函数,可以通过Click的上下文(context.obj)传递非CLI参数:

import click
import json

response_dict = json.loads(response.text)

@click.command()
@click.argument("md5hash_passed")
def find_pr_id(md5hash_passed):
    # 从上下文获取传入的response字典
    response = click.get_current_context().obj
    for item in response["values"]:
        fromref = item["fromRef"]
        if fromref["latestCommit"] == md5hash_passed:
            click.echo(item["id"])
            return
    click.echo("未匹配到对应的PR ID")

if __name__ == "__main__":
    # 调用Click命令时,通过obj参数传入response_dict
    find_pr_id(obj=response_dict)

关键说明

  • Click命令函数的参数只能是由Click装饰器定义的CLI参数,无法直接传入非CLI参数,所以需要通过上述两种方式传递额外数据。
  • Click命令函数中不要用return返回结果,CLI调用时无法看到返回值,必须用click.echo()输出内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 21:50:36