Pattern Maching ID not working in Dash callback `cancel`
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 24.4k
- Forks
- 2.3k
- Avg merge
- 2d 7h
- Merged PRs (30d)
- 13
Description
Environment:
dash 2.17.1
dash_ag_grid 31.2.0
dash-bootstrap-components 1.6.0
dash-core-components 2.0.0
dash-html-components 2.0.0
dash-table 5.0.0
Describe the bug
When defining the cancel behaviour of a Dash bootstrap component button within the callback signature I am greeted with the error
dash.exceptions.WildcardInLongCallback: long callbacks does not support dependencies with
pattern-matching ids
Received: <Input `{"index":["MATCH"],"type":"cancel-button"}.n_clicks`>
Using pattern matching IDs in the running kwarg for the callback signature works perfectly fine but the cancel kwarg does not.
Expected behavior
I expected the cancel behaviour to work as with buttons without pattern matching IDs after coming across what I thought were the fixes here.
Example
from dash import Dash, html, callback, Output, Input, DiskcacheManager, MATCH
import dash_bootstrap_components as dbc
import diskcache, time
cache = diskcache.Cache("./cache")
background_callback_manager = DiskcacheManager(cache)
app = Dash(__name__, background_callback_manager=background_callback_manager)
app.layout = html.Div(
[
html.Div([html.P(id={"type": "paragraph_id", "index": 1}, children=["Button 1 not clicked"])]),
dbc.Button(id={"type": "button_id", "index": 1}, children="Run Job 1!"),
dbc.Button(id={"type": "button_id", "index": 2}, children="Run Job 2!"),
dbc.Button(id={"type": "cancel_button_id", "index": 1}, children="Cancel Running Job 1!"),
dbc.Button(id={"type": "cancel_button_id", "index": 2}, children="Cancel Running Job 2!"),
html.Div([html.P(id={"type": "paragraph_id", "index": 2}, children=["Button 2 not clicked"])]),
]
)
@callback(
output=Output({"type": "paragraph_id", "index": MATCH}, "children"),
inputs=Input({"type": "button_id", "index": MATCH}, "n_clicks"),
running=[
(Output({"type": "button_id", "index": MATCH}, "disabled"), True, False),
(Output({"type": "cancel_button_id", "index": MATCH}, "disabled"), False, True),
],
cancel=[Input({"type": "cancel_button_id", "index": MATCH}, "n_clicks")],
background=True,
prevent_initial_call=True
)
def callback(n_clicks):
time.sleep(2.0)
return [f"Clicked {n_clicks} times"]
if __name__ == "__main__":
app.run(debug=True)
returns the following error:
dash.exceptions.WildcardInLongCallback: long callbacks does not support dependencies with
pattern-matching ids
Received: <Input `{"index":["MATCH"],"type":"cancel_button_id"}.n_clicks`>
However if I comment out the cancel kwarg, the dashboard runs, the cancel buttons just don't function how I want them to.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Run the provided minimal Dash app with the listed package versions and confirm that the pattern-matching cancel Input raises WildcardInLongCallback while the running dependencies work. Done means the example starts successfully with the MATCH cancel dependency and the cancel buttons function without the reported exception.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- backend
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Clearly specified
- Newbie friendliness
- 45/100