Plotly Dash long_callback states传参缺失位置参数报错修复
问题说明
使用Plotly Dash框架的@app.long_callback装饰器开发长回调时,代码运行触发参数缺失报错;相同入参、状态参数逻辑改用普通@app.callback装饰器编写时可正常运行。
触发报错的长回调代码:
@app.long_callback( outputs = Output("optimize-result", "children"), inputs = Input("optimize-button-id", "n_clicks"), states = dict( reorder_period = State("reorder-period-dropdown-id", "value"), forecast = State("forecast-dropdown-id", "value") ), running = [ (Output("optimize-button-id", "disabled"), True, False), ], prevent_initial_call = True, ) def load_optimize_data_button_click(number_clicks, reorder_period, forecast):
运行抛出的错误信息:
TypeError: load_optimize_data_button_click() missing 2 required positional arguments: 'reorder_period' and 'forecast'
可正常运行的普通回调参考代码:
@app.callback( Output("optimize-result", "children"), Input("optimize-button-id", "n_clicks"), State("reorder-period-dropdown-id", "value"), State("forecast-dropdown-id", "value"), prevent_initial_call = True, ) def load_optimize_data_button_click(number_clicks, reorder_period, forecast):
报错原因
@app.long_callback默认不支持将states参数以字典格式传入做关键字参数映射,装饰器不会解析字典内部定义的State依赖项,这两个状态参数不会被传入回调函数,最终触发位置参数缺失报错。
长回调默认的参数传递逻辑和普通回调完全一致:inputs、states中定义的所有依赖项,会按照定义顺序依次作为位置参数传入回调函数。
修复方案
将states参数从字典格式改为按顺序排列的State对象列表即可,和普通回调的参数写法对齐。修正后的可运行代码如下:
@app.long_callback( output = Output("optimize-result", "children"), inputs = Input("optimize-button-id", "n_clicks"), states = [ State("reorder-period-dropdown-id", "value"), State("forecast-dropdown-id", "value") ], running = [ (Output("optimize-button-id", "disabled"), True, False), ], prevent_initial_call = True, ) def load_optimize_data_button_click(number_clicks, reorder_period, forecast): # 原有业务逻辑
注:
@app.long_callback的输出参数官方规范写法为单数形式output,复数形式outputs虽在部分版本可兼容运行,但不推荐使用。
内容的提问来源于stack exchange,提问作者user3680510
相关产品推荐
相关产品推荐

