Keyword Input Arguments for Click Events

这个报错/特性请求通常出现在用 Gradio 的 Button.click() 等事件绑定函数,而目标函数包含关键字参数(尤其是 keyword-only 参数)时;Gradio 当时只支持位置参数传入,因此需要先确认你的函数签名和事件绑定方式。

快速结论:这个报错/特性请求通常出现在用 Gradio 的 Button.click() 等事件绑定函数,而目标函数包含关键字参数(尤其是 keyword-only 参数)时;Gradio 当时只支持位置参数传入,因此需要先确认你的函数签名和事件绑定方式。

适用环境:Issue 中已确认工具为 Gradio(Python);未提供具体操作系统、Python、CUDA、显卡或依赖版本信息。

最快修复方案:暂无确认的一步修复方案。Issue 中明确提到的临时处理方式是自行编写一个 wrapper 函数,把关键字参数在 wrapper 内部补齐后再交给 Gradio 事件。

注意事项:Issue 中维护者表示该特性需要较多改动,计划在 4.0 之后再看;后续有贡献者表示愿意实现 inputs_kwargs 并保持对现有 inputs API 的向后兼容,但这属于提议阶段,不能当作已发布功能使用。因此不要直接照搬示例中的 inputs_kwargs 参数,除非你确认所用 Gradio 版本已经支持该参数。

问题场景

用户在 Gradio 中把模型函数包装成 WebUI,并通过 gradio.Button.click 绑定点击事件。该模型函数包含大量关键字参数,或含有 keyword-only 参数,例如示例中的 greet(name: str, *, last_name: str)。Gradio 的事件绑定在 Issue 当时只支持位置参数列表 inputs=[...],无法直接把 last_name 这类参数以关键字形式传给 fn,因此用户只能额外写 wrapper。

报错原文

Keyword Input Arguments for Click Events

Issue 正文中的需求示例为:

import gradio as gr


def greet(name: str, *, last_name: str):
    return name + " " + last_name

with gr.Blocks() as demo:
    txt_0 = gr.Text()
    txt_1 = gr.Text()
    txt_2 = gr.Text()
    btn = gr.Button("Click me")
    # This is the change, allow inputs be a positional argument list and inputs_kwargs be a dictionary of args
    btn.click(greet, inputs=[txt_0], inputs_kwargs={'last_name': txt_1}, outputs=[txt_2])


if __name__ == '__main__':
    demo.launch(server_name="0.0.0.0", server_port=7860)

原因分析

可能原因是 Gradio 的事件绑定接口在 Issue 对应版本中只按位置顺序把 inputs 里的组件值传给 fn,并不识别或注入关键字参数。因此当目标函数包含 keyword-only 参数,或调用方希望绕过位置顺序直接按参数名传值时,就无法直接绑定,只能通过 wrapper 把位置参数转换成目标函数所需的关键字参数。

环境排查

  • 确认当前使用的 Gradio 版本是否已经支持 inputs_kwargs;Issue 中未给出具体版本号,需以实际安装版本的文档和源码为准。
  • 确认触发问题的函数签名:是否包含 keyword-only 参数(如 * 之后的参数),或是否必须按参数名传值。
  • 确认事件绑定写法:当前是否只用了 inputs=[...],以及 inputs 中组件数量、顺序是否与函数参数匹配。
  • 确认是否存在 wrapper:如果已有 wrapper,检查 wrapper 是否已经正确把组件值映射为目标函数的关键字参数。
  • Issue 未提供 Python、CUDA、PyTorch、显卡或操作系统版本,这些项目无法从当前讨论中确认,不需要优先排查。

解决步骤

  1. 先检查你安装的 Gradio 版本是否已经正式支持 inputs_kwargs。如果支持,可以按 Issue 中的目标用法尝试;如果文档和源码中没有该参数,则不要直接使用。
  2. 如果当前版本不支持,保留 Issue 中提到的临时方案:为 greet 这类函数写一层 wrapper,让 Gradio 的 inputs 先传入位置参数,再由 wrapper 调用目标函数并传入关键字参数。
  3. wrapper 中要明确把每个 inputs 组件对应到目标函数的参数名,避免依赖位置顺序造成错位;对 keyword-only 参数尤其要显式写出参数名。
  4. 事件仍然使用 btn.click(...),把 wrapper 作为 fninputs 传入需要的组件,outputs 传入输出组件。
  5. 如果愿意推动该特性,可以参考 Issue 中贡献者的提议:实现 inputs_kwargs 并保持对现有 inputs API 的向后兼容,然后提交 PR。但这属于开发贡献路径,不是终端用户的即时修复。

验证方法

启动 Gradio 应用后点击按钮,确认输出组件得到的结果与直接调用目标函数一致,尤其是 keyword-only 参数对应的值来自正确的输入组件。如果使用 wrapper,还应确认当 inputs 顺序变化或组件增减时,wrapper 中的参数映射不会静默错位。若 Gradio 版本已支持 inputs_kwargs,则可用 Issue 中的 btn.click(greet, inputs=[txt_0], inputs_kwargs={'last_name': txt_1}, outputs=[txt_2]) 形式做对照验证。

参考来源

gradio-app/gradio #5049

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 25314

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注