TYP: Avoid shadowed dtype annotations - #31951
Merged
jorenham merged 1 commit intoJul 10, 2026
Merged
Conversation
NumPy numpygh-30754 fixed annotations shadowed by class members under Python 3.14 annotation-scope rules. Later ndarray and MaskedArray signatures reintroduced bare dtype references, which ty resolves to the dtype property and consequently infers Unknown for operations such as argmax(keepdims=True). Use _dtype or np.dtype for the 53 affected annotations and bounds, and move the _dtype alias below the dtype definition. This restores precise ty inference without changing runtime behavior. A follow-up could add ty alongside Pyrefly in the type-checking workflow and check the 166 production .pyi files. With the small existing baseline of final-class, override, parameter-default, and type-argument diagnostics suppressed, invalid-type-form can remain enabled and would catch regressions like this. Follow-up to numpygh-30754.
jorenham
approved these changes
Jul 10, 2026
jorenham
left a comment
Member
There was a problem hiding this comment.
Thanks Jelle!
Personally I think we should support as many type checkers as we reasonably can. I've been using ty in scipy-stubs for a while now, and even though there are still things it doesn't support (e.g. variadic type parameters), it has been smooth sailing so far. So as far as I'm concerned I'm all for adding ty as a CI job (as long as it doesn't require too many workarounds, that is).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
PR summary
gh-30754 fixed annotations shadowed by class members under
Python 3.14 annotation-scope rules. Later ndarray and MaskedArray
signatures reintroduced bare dtype references, which the ty type checker resolves to
the dtype property. As a result, it infers Unknown for operations
such as argmax(keepdims=True).
Use _dtype or np.dtype for the 53 affected annotations and bounds, and
move the _dtype alias below the dtype definition. This restores precise
ty inference without changing runtime behavior.
A follow-up could add ty alongside Pyrefly in the type-checking
workflow and check the 166 production .pyi files. With the small
existing baseline of final-class, override, parameter-default, and
type-argument diagnostics suppressed, invalid-type-form can remain
enabled and would catch regressions like this. If a maintainer agrees
that running ty in CI is valuable, I can work on this as a followup.
Follow-up to gh-30754.
First time committer introduction
This is @JelleZijlstra's work account. I have made many contributions to the Python ecosystem though as far as I recall I have not contributed to numpy before. See below for how I came to make this contribution.
AI Disclosure
I was having Codex look for cases where ty inferred less precise types than other type checkers. When it found some issues related to numpy, I had it prepare a fix inside numpy. I personally reviewed all code changes and wrote the final version of the PR body.