Skip to content

TYP: np.asarray improved shape-typing - #32263

Merged
charris merged 1 commit into
numpy:mainfrom
jorenham:typing/asarray/improved-shape-typing
Aug 12, 2026
Merged

charris merged 1 commit into
numpy:mainfrom
jorenham:typing/asarray/improved-shape-typing

Conversation

@jorenham

Copy link
Copy Markdown
Member

This ports the np.array shape-typing improvements from #32246 to np.asarray.


Mostly mechanical, so I used AI to copy over the overloads, and I then cleaned up some of the mistakes it made myself :p

@jorenham jorenham added this to the 2.6.0 Release milestone Aug 12, 2026
@github-actions

Copy link
Copy Markdown

Diff from mypy_primer, showing the effect of this PR on type check results on a corpus of open source code:

jax (https://github.com/google/jax)
+ jax/_src/array.py:414: note:     def [ShapeT: tuple[int, ...], DTypeT: dtype[Any]] asarray(a: _SupportsArray[ndarray[ShapeT, DTypeT]], dtype: None = ..., order: Literal['K', 'A', 'C', 'F'] | None = ..., *, device: Literal['cpu'] | None = ..., copy: bool | None = ..., like: _SupportsArrayFunc | None = ...) -> ndarray[ShapeT, DTypeT]
+ jax/_src/array.py:414: note:     def asarray(a: bool, dtype: None = ..., order: Literal['K', 'A', 'C', 'F'] | None = ..., *, device: Literal['cpu'] | None = ..., copy: bool | None = ..., like: _SupportsArrayFunc | None = ...) -> ndarray[tuple[()], dtype[numpy.bool[builtins.bool]]]
+ jax/_src/array.py:414: note:     def asarray(a: int, dtype: None = ..., order: Literal['K', 'A', 'C', 'F'] | None = ..., *, device: Literal['cpu'] | None = ..., copy: bool | None = ..., like: _SupportsArrayFunc | None = ...) -> ndarray[tuple[()], dtype[signedinteger[_32Bit | _64Bit] | Any]]
+ jax/_src/array.py:414: note:     def asarray(a: float, dtype: None = ..., order: Literal['K', 'A', 'C', 'F'] | None = ..., *, device: Literal['cpu'] | None = ..., copy: bool | None = ..., like: _SupportsArrayFunc | None = ...) -> ndarray[tuple[()], dtype[float64 | Any]]
+ jax/_src/array.py:414: note:     def asarray(a: complex, dtype: None = ..., order: Literal['K', 'A', 'C', 'F'] | None = ..., *, device: Literal['cpu'] | None = ..., copy: bool | None = ..., like: _SupportsArrayFunc | None = ...) -> ndarray[tuple[()], dtype[complex128 | Any]]
+ jax/_src/array.py:414: note:     def [ScalarT: generic[Any]] asarray(a: complex | str | generic[Any], dtype: type[ScalarT] | dtype[ScalarT] | _HasDType[dtype[ScalarT]] | _HasNumPyDType[dtype[ScalarT]], order: Literal['K', 'A', 'C', 'F'] | None = ..., *, device: Literal['cpu'] | None = ..., copy: bool | None = ..., like: _SupportsArrayFunc | None = ...) -> ndarray[tuple[()], dtype[ScalarT]]
+ jax/_src/array.py:414: note:     def asarray(a: complex | str | generic[Any], dtype: type | str | dtype[Any] | _HasDType[dtype[Any]] | _HasNumPyDType[dtype[Any]] | tuple[Any, Any] | list[Any] | _DTypeDict, order: Literal['K', 'A', 'C', 'F'] | None = ..., *, device: Literal['cpu'] | None = ..., copy: bool | None = ..., like: _SupportsArrayFunc | None = ...) -> ndarray[tuple[()], dtype[Any]]
+ jax/_src/array.py:414: note:     def asarray(a: Sequence[Sequence[list[float]]], dtype: None = ..., order: Literal['K', 'A', 'C', 'F'] | None = ..., *, device: Literal['cpu'] | None = ..., copy: bool | None = ..., like: _SupportsArrayFunc | None = ...) -> ndarray[tuple[int, int, int], dtype[float64]]
+ jax/_src/array.py:414: note:     def asarray(a: Sequence[Sequence[Sequence[bool]]], dtype: None = ..., order: Literal['K', 'A', 'C', 'F'] | None = ..., *, device: Literal['cpu'] | None = ..., copy: bool | None = ..., like: _SupportsArrayFunc | None = ...) -> ndarray[tuple[int, int, int], dtype[numpy.bool[builtins.bool]]]
+ jax/_src/array.py:414: note:     def asarray(a: Sequence[Sequence[list[int]]], dtype: None = ..., order: Literal['K', 'A', 'C', 'F'] | None = ..., *, device: Literal['cpu'] | None = ..., copy: bool | None = ..., like: _SupportsArrayFunc | None = ...) -> ndarray[tuple[int, int, int], dtype[signedinteger[_32Bit | _64Bit]]]
+ jax/_src/array.py:414: note:     def asarray(a: Sequence[Sequence[list[complex]]], dtype: None = ..., order: Literal['K', 'A', 'C', 'F'] | None = ..., *, device: Literal['cpu'] | None = ..., copy: bool | None = ..., like: _SupportsArrayFunc | None = ...) -> ndarray[tuple[int, int, int], dtype[complex128]]
+ jax/_src/array.py:414: note:     def [ScalarT: generic[Any]] asarray(a: Sequence[Sequence[Sequence[complex | str | bytes | generic[Any]]]], dtype: type[ScalarT] | dtype[ScalarT] | _HasDType[dtype[ScalarT]] | _HasNumPyDType[dtype[ScalarT]], order: Literal['K', 'A', 'C', 'F'] | None = ..., *, device: Literal['cpu'] | None = ..., copy: bool | None = ..., like: _SupportsArrayFunc | None = ...) -> ndarray[tuple[int, int, int], dtype[ScalarT]]
+ jax/_src/array.py:414: note:     def asarray(a: Sequence[Sequence[Sequence[complex | str | bytes | generic[Any]]]], dtype: type | str | dtype[Any] | _HasDType[dtype[Any]] | _HasNumPyDType[dtype[Any]] | tuple[Any, Any] | list[Any] | _DTypeDict, order: Literal['K', 'A', 'C', 'F'] | None = ..., *, device: Literal['cpu'] | None = ..., copy: bool | None = ..., like: _SupportsArrayFunc | None = ...) -> ndarray[tuple[int, int, int], dtype[Any]]

optuna (https://github.com/optuna/optuna)
  ./optuna/study/_multi_objective.py:182: error: INTERNAL ERROR -- Please try using mypy master on GitHub:

@jorenham

Copy link
Copy Markdown
Member Author

The mypy_primer diff for jax are just note (i.e. extra context for a pre-existing error), so no new typing errors or something.

@charris
charris merged commit 81260f8 into numpy:main Aug 12, 2026
15 checks passed
@charris

charris commented Aug 12, 2026

Copy link
Copy Markdown
Member

Thanks Joren.

@jorenham
jorenham deleted the typing/asarray/improved-shape-typing branch August 12, 2026 22:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants