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 git@github.com: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.
Yes, I hope we just have to handle codes.REDUNDANT_CAST the same way as codes.REDUNDANT_EXPR in #19118. Maybe there are more such candidates? (UNUSED_IGNORE or so)
Activity
hauntsaninja commented on May 30, 2025
Thanks! Probably proximal cause is #18588
If you'd like to upgrade to 1.16, p(logger, meth_name, cast(Any, ed)) is probably a foolproof workaround
hauntsaninja commented on May 30, 2025
Minimised repro:
from typing import Callable, cast class X: ... ProcessorReturnValue = X | str | bytes Processor = Callable[[X], ProcessorReturnValue] def main_cast(p: Processor) -> None: ed: ProcessorReturnValue ed = cast(X, ...) for _ in range(5): ed = p(cast(X, ed)) def main_no_cast(p: Processor) -> None: ed: ProcessorReturnValue ed = cast(X, ...) for _ in range(5): ed = p(ed)I guess the cast is redundant the second time through the loop...
tyralla commented on May 30, 2025
Yes, I hope we just have to handle codes.REDUNDANT_CAST the same way as codes.REDUNDANT_EXPR in #19118. Maybe there are more such candidates? (UNUSED_IGNORE or so)
Avoid false `unreachable`, `redundant-expr`, and `redundant-casts` wa…