Version 3 adds breaking type annotations that do not comply with mypy
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 24.4k
- Forks
- 2.3k
- Avg merge
- 2d 7h
- Merged PRs (30d)
- 13
Description
With the release of dash 3.0 our CI/CD fails for stuff that used to work.
Here's a minimum working example:
from dash import Dash, dcc, html
from dash.dependencies import Input, Output
from typing import Callable
app = Dash(__name__)
def create_layout() -> html.Div:
return html.Div([
dcc.Input(id='input-text', type='text', value='', placeholder='Enter text'),
html.Div(id='output-text')
])
app.layout = create_layout
@app.callback(Output('output-text', 'children'), Input('input-text', 'value'))
def update_output(value: str) -> str:
return f'You entered: {value}'
if __name__ == '__main__':
app.run(debug=True, port=9000)
running mypy on this file results in:
$ mypy t.py --strict
t.py:1: error: Skipping analyzing "dash": module is installed, but missing library stubs or py.typed marker [import-untyped]
t.py:2: error: Skipping analyzing "dash.dependencies": module is installed, but missing library stubs or py.typed marker [import-untyped]
t.py:2: note: See https://mypy.readthedocs.io/en/stable/running_mypy.html#missing-imports
t.py:15: error: Untyped decorator makes function "update_output" untyped [misc]
Found 3 errors in 1 file (checked 1 source file)
which we used to solve by adding # type: ignore[misc] to every callback call and by adding
[[tool.mypy.overrides]]
module = [
"dash.*",
"dash_ag_grid",
"dash_bootstrap_components.*",
"plotly.*",
]
ignore_missing_imports = true
to our pyproject.toml.
However, when updating to version 3, we get:
$ mypy --strict t.py
t.py:8: error: Returning Any from function declared to return "Div" [no-any-return]
t.py:13: error: Property "layout" defined in "Dash" is read-only [misc]
t.py:15: error: Call to untyped function "Input" in typed context [no-untyped-call]
t.py:15: error: Call to untyped function "Output" in typed context [no-untyped-call]
t.py:15: error: Call to untyped function "callback" in typed context [no-untyped-call]
t.py:15: note: Error code "no-untyped-call" not covered by "type: ignore" comment
Found 5 errors in 1 file (checked 1 source file)
without changing anything else.
This can't be intended behavior, right? How to fix that?
community post: https://community.plotly.com/t/dash-3-0-fails-mypy/91308
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
Start with the minimal example in t.py and run mypy --strict to reproduce the reported errors. Inspect the Dash 3 annotations involved in Dash.layout, Input, Output, and callback, along with the pyproject.toml mypy overrides. Done means the example type-checks without the reported errors while preserving the documented Dash usage.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- developer-experience
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100