Skip to content

TYP: Avoid shadowed dtype annotations - #31955

Merged
charris merged 1 commit into
numpy:maintenance/2.5.xfrom
charris:backport-31951
Jul 10, 2026
Merged

TYP: Avoid shadowed dtype annotations#31955
charris merged 1 commit into
numpy:maintenance/2.5.xfrom
charris:backport-31951

Conversation

@charris

@charris charris commented Jul 10, 2026

Copy link
Copy Markdown
Member

Backport of #31951.

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.

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.
@charris charris added this to the 2.5.2 release milestone Jul 10, 2026
@charris charris added 08 - Backport Used to tag backport PRs 41 - Static typing labels Jul 10, 2026
@charris
charris merged commit 9b9bf5f into numpy:maintenance/2.5.x Jul 10, 2026
12 checks passed
@charris
charris deleted the backport-31951 branch July 10, 2026 21:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

08 - Backport Used to tag backport PRs 41 - Static typing

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants