Fix crash involving explicit reexport, import cycle, wildcard #11632
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Fixes #8481
Fixes #9941
Fixes #11025
Fixes #11038
This is the unresolved crash that's been reported the most times, e.g., it's as easy to repro as
mypy --no-implicit-reexport -c 'import pytorch_lightning'
(or evenimport torch
, with the right PyTorch version). I know of multiple popular Python packages that have made changes just to work around this crash. I would love to see this released, potentially along with #11630.Thanks to @rraval for making a minimal repro!
The fix ended up being a one-liner, but it took me a bit to track down :-)
Since things worked with implicit reexport, I differentially patched in explicit reexport logic to narrow things down. This let me observe that if I hardcoded pkg.a.B to get reexported, we hit this branch, which clobbers the PlaceholderNode for pkg.c.B, which fixes things:
mypy/mypy/semanal.py
Line 2028 in f79e7af
Which is a little weird — we shouldn't have a PlaceholderNode for pkg.c.B at all. But with a breakpoint in that branch, it was easy to notice that with
--no-implicit-reexport
pkg.a.B was first created withmodule_public=True
(resulting in creation of a PlaceholderNode in pkg.c.B) and only on a later pass acquiredmodule_public=False
. So tracking down where pkg.a.B symbol was first created withmodule_public=True
led me to this "obvious" bug.