Skip to content

Commit 6d2c612

Browse files
authored
Merge pull request #588 from numpy/gh-118
2 parents baace25 + d37bc02 commit 6d2c612

5 files changed

Lines changed: 96 additions & 65 deletions

File tree

src/numpy-stubs/@test/static/accept/multiarray.pyi

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ def func12(a: int) -> tuple[complex, str]: ...
4545
assert_type(next(b_f8), tuple[Any, ...])
4646
assert_type(b_f8.reset(), None)
4747
assert_type(b_f8.index, int)
48-
assert_type(b_f8.iters, tuple[np.flatiter[Any], ...])
48+
assert_type(b_f8.iters, tuple[np.flatiter, ...])
4949
assert_type(b_f8.nd, int)
5050
assert_type(b_f8.ndim, int)
5151
assert_type(b_f8.numiter, int)
@@ -55,7 +55,7 @@ assert_type(b_f8.size, int)
5555
assert_type(next(b_i8_f8_f8), tuple[Any, ...])
5656
assert_type(b_i8_f8_f8.reset(), None)
5757
assert_type(b_i8_f8_f8.index, int)
58-
assert_type(b_i8_f8_f8.iters, tuple[np.flatiter[Any], ...])
58+
assert_type(b_i8_f8_f8.iters, tuple[np.flatiter, ...])
5959
assert_type(b_i8_f8_f8.nd, int)
6060
assert_type(b_i8_f8_f8.ndim, int)
6161
assert_type(b_i8_f8_f8.numiter, int)

src/numpy-stubs/@test/static/accept/nditer.pyi

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import assert_type
1+
from typing import Any, assert_type
22

33
import _numtype as _nt
44
import numpy as np
@@ -10,23 +10,23 @@ assert_type(np.nditer([0, 1], op_flags=[["readonly", "readonly"]]), np.nditer)
1010
assert_type(np.nditer([0, 1], op_dtypes=np.int_), np.nditer)
1111
assert_type(np.nditer([0, 1], order="C", casting="no"), np.nditer)
1212

13-
assert_type(nditer_obj.dtypes, tuple[np.dtype, ...])
13+
assert_type(nditer_obj.dtypes, tuple[np.dtype, *tuple[np.dtype, ...]])
1414
assert_type(nditer_obj.finished, bool)
1515
assert_type(nditer_obj.has_delayed_bufalloc, bool)
1616
assert_type(nditer_obj.has_index, bool)
1717
assert_type(nditer_obj.has_multi_index, bool)
1818
assert_type(nditer_obj.index, int)
1919
assert_type(nditer_obj.iterationneedsapi, bool)
2020
assert_type(nditer_obj.iterindex, int)
21-
assert_type(nditer_obj.iterrange, tuple[int, ...])
21+
assert_type(nditer_obj.iterrange, tuple[int, int])
2222
assert_type(nditer_obj.itersize, int)
23-
assert_type(nditer_obj.itviews, tuple[_nt.Array, ...])
23+
assert_type(nditer_obj.itviews, tuple[_nt.Array, *tuple[_nt.Array, ...]])
2424
assert_type(nditer_obj.multi_index, tuple[int, ...])
2525
assert_type(nditer_obj.ndim, int)
2626
assert_type(nditer_obj.nop, int)
27-
assert_type(nditer_obj.operands, tuple[_nt.Array, ...])
27+
assert_type(nditer_obj.operands, tuple[_nt.Array, *tuple[_nt.Array, ...]])
2828
assert_type(nditer_obj.shape, tuple[int, ...])
29-
assert_type(nditer_obj.value, tuple[_nt.Array, ...])
29+
assert_type(nditer_obj.value, _nt.Array | Any)
3030

3131
assert_type(nditer_obj.close(), None)
3232
assert_type(nditer_obj.copy(), np.nditer)
@@ -39,7 +39,7 @@ assert_type(nditer_obj.reset(), None)
3939

4040
assert_type(len(nditer_obj), int)
4141
assert_type(iter(nditer_obj), np.nditer)
42-
assert_type(next(nditer_obj), tuple[_nt.Array, ...])
42+
assert_type(next(nditer_obj), _nt.Array | Any)
4343
assert_type(nditer_obj.__copy__(), np.nditer) # noqa: PLC2801
4444
with nditer_obj as f:
4545
assert_type(f, np.nditer)

src/numpy-stubs/@test/static/reject/multiarray.pyi

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@ np.datetime_as_string("2012") # type: ignore[call-overload] # pyright: ignore[
4242

4343
np.char.compare_chararrays("a", b"a", "==", False) # type: ignore[call-overload] # pyright: ignore[reportArgumentType, reportCallIssue]
4444

45-
np.nested_iters([AR_i8, AR_i8]) # type: ignore[call-arg] # pyright: ignore[reportCallIssue]
46-
np.nested_iters([AR_i8, AR_i8], 0) # type: ignore[arg-type] # pyright: ignore[reportArgumentType]
47-
np.nested_iters([AR_i8, AR_i8], [0]) # type: ignore[list-item] # pyright: ignore[reportArgumentType]
48-
np.nested_iters([AR_i8, AR_i8], [[0], [1]], flags=["test"]) # type: ignore[list-item] # pyright: ignore[reportArgumentType]
49-
np.nested_iters([AR_i8, AR_i8], [[0], [1]], op_flags=[["test"]]) # type: ignore[list-item] # pyright: ignore[reportArgumentType]
50-
np.nested_iters([AR_i8, AR_i8], [[0], [1]], buffersize=1.0) # type: ignore[arg-type] # pyright: ignore[reportArgumentType]
45+
np.nested_iters([AR_i8, AR_i8]) # type: ignore[call-overload] # pyright: ignore[reportCallIssue]
46+
np.nested_iters([AR_i8, AR_i8], 0) # type: ignore[call-overload] # pyright: ignore[reportArgumentType, reportCallIssue]
47+
np.nested_iters([AR_i8, AR_i8], [0]) # type: ignore[list-item] # pyright: ignore[reportArgumentType, reportCallIssue]
48+
np.nested_iters([AR_i8, AR_i8], [[0], [1]], flags=["test"]) # type: ignore[list-item] # pyright: ignore[reportArgumentType, reportCallIssue]
49+
np.nested_iters([AR_i8, AR_i8], [[0], [1]], op_flags=[["test"]]) # type: ignore[list-item] # pyright: ignore[reportArgumentType, reportCallIssue]
50+
np.nested_iters([AR_i8, AR_i8], [[0], [1]], buffersize=1.0) # type: ignore[call-overload] # pyright: ignore[reportArgumentType, reportCallIssue]

src/numpy-stubs/@test/static/reject/nditer.pyi

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import numpy as np
22

33
class Test(np.nditer): ... # type: ignore[misc] # pyright: ignore[reportGeneralTypeIssues]
44

5-
np.nditer([0, 1], flags=["test"]) # type: ignore[list-item] # pyright: ignore[reportArgumentType]
6-
np.nditer([0, 1], op_flags=[["test"]]) # type: ignore[list-item] # pyright: ignore[reportArgumentType]
7-
np.nditer([0, 1], itershape=(1.0,)) # type: ignore[arg-type] # pyright: ignore[reportArgumentType]
8-
np.nditer([0, 1], buffersize=1.0) # type: ignore[arg-type] # pyright: ignore[reportArgumentType]
5+
np.nditer([0, 1], flags=["test"]) # type: ignore[list-item] # pyright: ignore[reportArgumentType, reportCallIssue]
6+
np.nditer([0, 1], op_flags=[["test"]]) # type: ignore[list-item] # pyright: ignore[reportArgumentType, reportCallIssue]
7+
np.nditer([0, 1], itershape=(1.0,)) # type: ignore[arg-type] # pyright: ignore[reportArgumentType, reportCallIssue]
8+
np.nditer([0, 1], buffersize=1.0) # type: ignore[call-overload] # pyright: ignore[reportArgumentType, reportCallIssue]

src/numpy-stubs/_core/_multiarray_umath.pyi

Lines changed: 77 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ _IterFlag: TypeAlias = L[
101101
"reduce_ok",
102102
"zerosize_ok",
103103
]
104-
_IterFlagOp: TypeAlias = L[
104+
_OpFlag: TypeAlias = L[
105105
"readonly", "writeonly", "readwrite",
106106
"no_broadcast",
107107
"config",
@@ -114,6 +114,8 @@ _IterFlagOp: TypeAlias = L[
114114
"overlap_assume_elementwise",
115115
"virtual", # undocumented
116116
] # fmt: skip
117+
_OpFlags: TypeAlias = Sequence[_OpFlag]
118+
_OpAxes: TypeAlias = Sequence[CanIndex] | None
117119

118120
_ShapeLike1D: TypeAlias = CanIndex | tuple[CanIndex]
119121
_ShapeLike2D: TypeAlias = tuple[CanIndex, CanIndex]
@@ -308,7 +310,7 @@ class flagsobj:
308310
@final
309311
class broadcast:
310312
@property
311-
def iters(self) -> tuple[flatiter[Incomplete], ...]: ...
313+
def iters(self) -> tuple[flatiter[_nt.Array[Incomplete]], ...]: ...
312314
@property
313315
def index(self) -> int: ...
314316
@property
@@ -323,11 +325,11 @@ class broadcast:
323325
def shape(self) -> _nt.Shape: ...
324326

325327
#
326-
def __new__(cls, *args: npt.ArrayLike) -> Self: ...
328+
def __new__(cls, *args: _nt.ToGeneric_nd) -> Self: ...
327329

328330
#
329-
def __next__(self) -> tuple[Incomplete, ...]: ...
330331
def __iter__(self) -> Self: ...
332+
def __next__(self) -> tuple[Incomplete, ...]: ...
331333

332334
#
333335
def reset(self) -> None: ...
@@ -370,8 +372,38 @@ class flatiter(Generic[_ArrayT_co]):
370372

371373
@final
372374
class nditer:
375+
@overload
376+
def __init__(
377+
self,
378+
/,
379+
op: _nt.ToGeneric_nd,
380+
flags: Sequence[_IterFlag] | None = None,
381+
op_flags: _OpFlags | None = None,
382+
op_dtypes: _nt.ToDType | None = None,
383+
order: _OrderKACF = "K",
384+
casting: _CastingKind = "safe",
385+
op_axes: _OpAxes = None,
386+
itershape: _ShapeLike | None = None,
387+
buffersize: CanIndex = 0,
388+
) -> None: ...
389+
@overload
390+
def __init__(
391+
self,
392+
/,
393+
op: Sequence[_nt.ToGeneric_nd | None],
394+
flags: Sequence[_IterFlag] | None = None,
395+
op_flags: Sequence[_OpFlags] | None = None,
396+
op_dtypes: Sequence[_nt.ToDType | None] | None = None,
397+
order: _OrderKACF = "K",
398+
casting: _CastingKind = "safe",
399+
op_axes: Sequence[_OpAxes] | None = None,
400+
itershape: _ShapeLike | None = None,
401+
buffersize: CanIndex = 0,
402+
) -> None: ...
403+
404+
#
373405
@property
374-
def dtypes(self) -> tuple[np.dtype, ...]: ...
406+
def dtypes(self) -> tuple[np.dtype[Incomplete], *tuple[np.dtype[Incomplete], ...]]: ...
375407
@property
376408
def shape(self) -> _nt.Shape: ...
377409
@property
@@ -393,74 +425,73 @@ class nditer:
393425
@property
394426
def nop(self) -> int: ...
395427
@property
396-
def index(self) -> int: ...
428+
def index(self) -> int: ... # might raise ValueError
397429
@property
398-
def multi_index(self) -> tuple[int, ...]: ...
430+
def multi_index(self) -> _nt.Shape: ... # might raise ValueError
399431
@property
400432
def iterindex(self) -> int: ...
401433
@property
402434
def itersize(self) -> int: ...
403435
@property
404-
def iterrange(self) -> tuple[int, ...]: ...
436+
def iterrange(self) -> tuple[int, int]: ...
405437
@property
406-
def itviews(self) -> tuple[_nt.Array[Incomplete], ...]: ...
438+
def itviews(self) -> tuple[_nt.Array[Incomplete], *tuple[_nt.Array[Incomplete], ...]]: ...
407439
@property
408-
def operands(self) -> tuple[_nt.Array[Incomplete], ...]: ...
409-
@property
410-
def value(self) -> tuple[_nt.Array[Incomplete], ...]: ...
411-
412-
#
413-
def __init__(
414-
self,
415-
/,
416-
op: Sequence[npt.ArrayLike | None] | npt.ArrayLike,
417-
flags: Sequence[_IterFlag] | None = None,
418-
op_flags: Sequence[Sequence[_IterFlagOp]] | None = None,
419-
op_dtypes: Sequence[npt.DTypeLike] | npt.DTypeLike = None,
420-
order: _OrderKACF = "K",
421-
casting: _CastingKind = "safe",
422-
op_axes: Sequence[Sequence[CanIndex]] | None = None,
423-
itershape: _ShapeLike | None = None,
424-
buffersize: CanIndex = 0,
425-
) -> None: ...
440+
def operands(self) -> tuple[_nt.Array[Incomplete], *tuple[_nt.Array[Incomplete], ...]]: ...
426441

427442
#
428443
def __enter__(self) -> Self: ...
429444
def __exit__(self, t: type[BaseException] | None, e: BaseException | None, tb: TracebackType | None, /) -> None: ...
430445
def close(self) -> None: ...
431446
def reset(self) -> None: ...
447+
def enable_external_loop(self) -> None: ...
448+
def remove_axis(self, i: CanIndex, /) -> None: ...
449+
def remove_multi_index(self) -> None: ...
450+
def debug_print(self) -> None: ...
451+
def iternext(self) -> py_bool: ...
452+
453+
#
454+
def __copy__(self) -> Self: ...
455+
def copy(self) -> Self: ...
432456

433457
#
434-
def __len__(self) -> int: ...
435458
def __iter__(self) -> Self: ...
436-
def __next__(self) -> tuple[_nt.Array[Incomplete], ...]: ...
437-
def iternext(self) -> py_bool: ...
459+
460+
# returns either a single array or a tuple of multiple arrays
461+
def __next__(self) -> _nt.Array[Incomplete] | Incomplete: ...
462+
@property
463+
def value(self) -> _nt.Array[Incomplete] | Incomplete: ...
438464

439465
#
466+
def __len__(self) -> int: ...
440467
@overload
441468
def __getitem__(self, index: CanIndex, /) -> _nt.Array[Incomplete]: ...
442469
@overload
443470
def __getitem__(self, index: slice, /) -> tuple[_nt.Array[Incomplete], ...]: ...
444-
def __setitem__(self, index: slice | CanIndex, value: npt.ArrayLike, /) -> None: ...
445-
446-
#
447-
def __copy__(self) -> Self: ...
448-
def copy(self) -> nditer: ...
449-
450-
# .
451-
def debug_print(self) -> None: ...
452-
def enable_external_loop(self) -> None: ...
453-
454-
#
455-
def remove_axis(self, i: CanIndex, /) -> None: ...
456-
def remove_multi_index(self) -> None: ...
471+
@overload
472+
def __setitem__(self, index: CanIndex, value: _nt.ToGeneric_nd, /) -> None: ...
473+
@overload
474+
def __setitem__(self, index: slice, value: Sequence[_nt.ToGeneric_nd], /) -> None: ...
457475

476+
#
477+
@overload
478+
def nested_iters(
479+
op: _nt.ToGeneric_nd,
480+
axes: Sequence[Sequence[CanIndex]],
481+
flags: Sequence[_IterFlag] | None = None,
482+
op_flags: _OpFlags | None = None,
483+
op_dtypes: _nt.ToDType | None = None,
484+
order: _OrderKACF = "K",
485+
casting: _CastingKind = "safe",
486+
buffersize: CanIndex = 0,
487+
) -> tuple[nditer, ...]: ...
488+
@overload
458489
def nested_iters(
459-
op: Sequence[npt.ArrayLike] | npt.ArrayLike,
490+
op: Sequence[_nt.ToGeneric_nd | None],
460491
axes: Sequence[Sequence[CanIndex]],
461492
flags: Sequence[_IterFlag] | None = None,
462-
op_flags: Sequence[Sequence[_IterFlagOp]] | None = None,
463-
op_dtypes: Sequence[npt.DTypeLike] | npt.DTypeLike = None,
493+
op_flags: Sequence[_OpFlags] | None = None,
494+
op_dtypes: Sequence[_nt.ToDType | None] | None = None,
464495
order: _OrderKACF = "K",
465496
casting: _CastingKind = "safe",
466497
buffersize: CanIndex = 0,

0 commit comments

Comments
 (0)