[ty] Check assignments to implicit global symbols are assignable to the types declared on types.ModuleType
#18077
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.
Summary
Currently we'll happily let you do this without complaining about it:
But this is unsound! All modules are instances of
types.ModuleType, and typeshed states that alltypes.ModuleTypeinstances have a__doc__attribute of typestr | None.Literal[42]is not assignable tostr | None, so we should not permit this.This PR fixes this soundness hole by falling back to declarations on
types.ModuleTypewhen checking assignments in the global scope. Cc. @tekknolagi (cf. #18071 (comment)).I also fix an issue in this PR where we would incorrectly report a symbol as being unbound if it is declared as global in an inner scope and it is an implicit
ModuleTypeglobal in the global scope, e.g.Test Plan
mdtests added