Description
Bug Report
Since 1.16, structlog's package type check fails with:
src/structlog/stdlib.py:1160: error: Redundant cast to "MutableMapping[str, Any]" [redundant-cast]
ed = p(logger, meth_name, cast(EventDict, ed))
^
Found 1 error in 1 file (checked 1 source file)
If I remove the cast, I get:
src/structlog/stdlib.py:1160: error: Argument 3 has incompatible type "Mapping[str, Any] | str | bytes | bytearray | tuple[Any, ...]"; expected
"MutableMapping[str, Any]" [arg-type]
ed = p(logger, meth_name, ed)
^~
Found 1 error in 1 file (checked 1 source file)
If I add a reveal_type, I get on both 1.15 & 1.16:
src/structlog/stdlib.py:1160: note: Revealed type is "typing.MutableMapping[builtins.str, Any]"
src/structlog/stdlib.py:1160: note: Revealed type is "Union[typing.Mapping[builtins.str, Any], builtins.str, builtins.bytes, builtins.bytearray, builtins.tuple[Any, ...]]"
So I guess Mypy got somehow smarter/confused about that?
To Reproduce
git clone [email protected]:hynek/structlog.git
git checkout d948027
- run
tox -e mypy-pkg
I really tried to create a minimal reproducer, but given that I don't quite understand what's going on, I've failed.
The relevant code is here: https://github.com/hynek/structlog/blob/e941e337d312eaf256595d9d09da4542c5e94d0b/src/structlog/stdlib.py#L1160
The types are defined here: https://github.com/hynek/structlog/blob/e941e337d312eaf256595d9d09da4542c5e94d0b/src/structlog/typing.py#L61-L76
Expected Behavior
I would expect it to keep working, or at least decide whether or not I need the cast. 🤓
Actual Behavior
I don't seem to find a way to make the code pass except using Any all over the place I guess.
Your Environment
- Mypy version used: 1.16
- Mypy command-line flags: none
- Mypy configuration options from
mypy.ini
(and other config files): https://github.com/hynek/structlog/blob/e941e337d312eaf256595d9d09da4542c5e94d0b/pyproject.toml#L175-L191 - Python version used: 3.13
edit I managed to work around it with the help of @Tinche but it still looks like I managed to break poor little Mypy.