如何在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
相关产品推荐
相关产品推荐

