Skip to content

Commit b0799de

Browse files
authored
use np.ndarray instead of CanArray in To*Strict{1,2,3}D on numpy<2.1 (#400)
2 parents 2dbca6a + 25aa9e5 commit b0799de

File tree

3 files changed

+99
-81
lines changed

3 files changed

+99
-81
lines changed

optype/numpy/_to.py

Lines changed: 42 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,9 @@
88
from typing_extensions import TypeAliasType, TypeVar
99

1010
import numpy as np
11-
import numpy_typing_compat
11+
import numpy_typing_compat as nptc
1212

1313
import optype.numpy.compat as npc
14-
from ._array import CanArray1D, CanArray2D, CanArray3D, CanArrayND
1514
from ._sequence_nd import SequenceND as SeqND
1615
from optype._core._just import JustComplex, JustFloat, JustInt
1716

@@ -125,88 +124,98 @@ def __dir__() -> list[str]:
125124
# (and aren't runtime checkable)
126125

127126

128-
class _CanArray0D(Protocol[SCT_co]):
129-
def __array__(self, /) -> np.ndarray[tuple[()], np.dtype[SCT_co]]: ...
127+
_CanArrayStrict1D = TypeAliasType(
128+
"_CanArrayStrict1D",
129+
"nptc.CanArray[tuple[int], np.dtype[SCT]]",
130+
type_params=(SCT,),
131+
)
132+
_CanArrayStrict2D = TypeAliasType(
133+
"_CanArrayStrict2D",
134+
"nptc.CanArray[tuple[int, int], np.dtype[SCT]]",
135+
type_params=(SCT,),
136+
)
137+
_CanArrayStrict3D = TypeAliasType(
138+
"_CanArrayStrict3D",
139+
"nptc.CanArray[tuple[int, int, int], np.dtype[SCT]]",
140+
type_params=(SCT,),
141+
)
130142

131143

132144
class _CanArrayND(Protocol[SCT_co]):
145+
def __len__(self, /) -> int: ...
133146
def __array__(self, /) -> np.ndarray[Any, np.dtype[SCT_co]]: ...
134147

135148

136-
_To1D1 = TypeAliasType(
137-
"_To1D1",
138-
CanArrayND[SCT] | Seq[_CanArray0D[SCT]],
139-
type_params=(SCT,),
140-
)
141-
_To1D2 = TypeAliasType(
142-
"_To1D2",
143-
CanArrayND[SCT] | Seq[T | _CanArray0D[SCT]],
144-
type_params=(T, SCT),
145-
)
149+
class _CanArray(Protocol[SCT_co]):
150+
def __array__(self, /) -> np.ndarray[Any, np.dtype[SCT_co]]: ...
151+
152+
153+
_To1D1 = TypeAliasType("_To1D1", _CanArrayND[SCT] | Seq[SCT], type_params=(SCT,))
154+
_To1D2 = TypeAliasType("_To1D2", _CanArrayND[SCT] | Seq[T | SCT], type_params=(T, SCT))
146155

147156
_To2D1 = TypeAliasType(
148157
"_To2D1",
149-
CanArrayND[SCT] | Seq[_To1D1[SCT]],
158+
_CanArrayND[SCT] | Seq[_To1D1[SCT]],
150159
type_params=(SCT,),
151160
)
152161
_To2D2 = TypeAliasType(
153162
"_To2D2",
154-
CanArrayND[SCT] | Seq[_To1D2[T, SCT]],
163+
_CanArrayND[SCT] | Seq[_To1D2[T, SCT]],
155164
type_params=(T, SCT),
156165
)
157166

158167
_To3D1 = TypeAliasType(
159168
"_To3D1",
160-
CanArrayND[SCT] | Seq[_To2D1[SCT]],
169+
_CanArrayND[SCT] | Seq[_To2D1[SCT]],
161170
type_params=(SCT,),
162171
)
163172
_To3D2 = TypeAliasType(
164173
"_To3D2",
165-
CanArrayND[SCT] | Seq[_To2D2[T, SCT]],
174+
_CanArrayND[SCT] | Seq[_To2D2[T, SCT]],
166175
type_params=(T, SCT),
167176
)
168177

169178
_ToND1 = TypeAliasType(
170179
"_ToND1",
171-
CanArrayND[SCT] | SeqND[_CanArrayND[SCT]],
180+
_CanArrayND[SCT] | SeqND[_CanArray[SCT]],
172181
type_params=(SCT,),
173182
)
174183
_ToND2 = TypeAliasType(
175184
"_ToND2",
176-
CanArrayND[SCT] | SeqND[T | _CanArrayND[SCT]],
185+
_CanArrayND[SCT] | SeqND[T | _CanArray[SCT]],
177186
type_params=(T, SCT),
178187
)
179188

180189
_ToStrict1D1 = TypeAliasType(
181190
"_ToStrict1D1",
182-
CanArray1D[SCT] | Seq[_CanArray0D[SCT]],
191+
_CanArrayStrict1D[SCT] | Seq[SCT],
183192
type_params=(SCT,),
184193
)
185194
_ToStrict1D2 = TypeAliasType(
186195
"_ToStrict1D2",
187-
CanArray1D[SCT] | Seq[T | _CanArray0D[SCT]],
196+
_CanArrayStrict1D[SCT] | Seq[T | SCT],
188197
type_params=(T, SCT),
189198
)
190199

191200
_ToStrict2D1 = TypeAliasType(
192201
"_ToStrict2D1",
193-
CanArray2D[SCT] | Seq[_ToStrict1D1[SCT]],
202+
_CanArrayStrict2D[SCT] | Seq[_ToStrict1D1[SCT]],
194203
type_params=(SCT,),
195204
)
196205
_ToStrict2D2 = TypeAliasType(
197206
"_ToStrict2D2",
198-
CanArray2D[SCT] | Seq[_ToStrict1D2[T, SCT]],
207+
_CanArrayStrict2D[SCT] | Seq[_ToStrict1D2[T, SCT]],
199208
type_params=(T, SCT),
200209
)
201210

202211
_ToStrict3D1 = TypeAliasType(
203212
"_ToStrict3D1",
204-
CanArray3D[SCT] | Seq[_ToStrict2D1[SCT]],
213+
_CanArrayStrict3D[SCT] | Seq[_ToStrict2D1[SCT]],
205214
type_params=(SCT,),
206215
)
207216
_ToStrict3D2 = TypeAliasType(
208217
"_ToStrict3D2",
209-
CanArray3D[SCT] | Seq[_ToStrict2D2[T, SCT]],
218+
_CanArrayStrict3D[SCT] | Seq[_ToStrict2D2[T, SCT]],
210219
type_params=(T, SCT),
211220
)
212221

@@ -218,7 +227,7 @@ def __array__(self, /) -> np.ndarray[Any, np.dtype[SCT_co]]: ...
218227
# https://github.com/jorenham/optype/issues/373
219228

220229
integer_co = TypeAliasType("integer_co", npc.integer | np.bool_)
221-
floating_co = TypeAliasType("floating_co", npc.floating | integer_co)
230+
floating_co = TypeAliasType("floating_co", npc.floating | npc.integer | np.bool_)
222231
complexfloating_co = TypeAliasType("complexfloating_co", npc.number | np.bool_)
223232

224233
# promotion rules with safe casting mode
@@ -236,11 +245,11 @@ def __array__(self, /) -> np.ndarray[Any, np.dtype[SCT_co]]: ...
236245
)
237246
f64_co = TypeAliasType(
238247
"f64_co",
239-
npc.floating64 | npc.floating32 | npc.floating16 | integer_co,
248+
npc.floating64 | npc.floating32 | npc.floating16 | npc.integer | np.bool_,
240249
)
241250
c128_co = TypeAliasType(
242251
"c128_co",
243-
npc.number64 | npc.number32 | npc.number16 | integer_co,
252+
npc.number64 | npc.number32 | npc.number16 | npc.integer | np.bool_,
244253
)
245254

246255

@@ -255,11 +264,11 @@ def __array__(self, /) -> np.ndarray[Any, np.dtype[SCT_co]]: ...
255264
ToArray3D: TypeAlias = _To3D2[T, SCT]
256265
ToArrayND: TypeAlias = _ToND2[T, SCT]
257266

258-
ToFalse = TypeAliasType("ToFalse", numpy_typing_compat.LiteralFalse | Literal[0])
259-
ToTrue = TypeAliasType("ToTrue", numpy_typing_compat.LiteralTrue | Literal[1])
267+
ToFalse = TypeAliasType("ToFalse", nptc.LiteralFalse | Literal[0])
268+
ToTrue = TypeAliasType("ToTrue", nptc.LiteralTrue | Literal[1])
260269

261-
ToJustFalse = TypeAliasType("ToJustFalse", numpy_typing_compat.LiteralFalse)
262-
ToJustTrue = TypeAliasType("ToJustTrue", numpy_typing_compat.LiteralTrue)
270+
ToJustFalse = TypeAliasType("ToJustFalse", nptc.LiteralFalse)
271+
ToJustTrue = TypeAliasType("ToJustTrue", nptc.LiteralTrue)
263272

264273
ToBool: TypeAlias = _PyBool | np.bool_
265274
ToBool1D: TypeAlias = _To1D2[_PyBool, np.bool_]

tests/numpy/test_to.pyi

Lines changed: 54 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,30 @@ from collections.abc import Sequence as Seq
44
from typing import Any, TypeAlias
55

66
import numpy as np
7-
from numpy._typing import _64Bit, _96Bit, _128Bit
7+
from numpy._typing import _96Bit, _128Bit
88

99
import optype.numpy as onp
1010

1111
__all__ = ()
1212

1313
# setup
1414

15-
_NBit_g: TypeAlias = _64Bit | _96Bit | _128Bit
16-
1715
_Sca_x: TypeAlias = np.generic
1816
_Sca_b: TypeAlias = np.bool_
1917
_Sca_i: TypeAlias = np.integer[Any]
20-
_Sca_f: TypeAlias = np.floating[_NBit_g] | np.float64 | np.float32 | np.float16
21-
_Sca_c: TypeAlias = np.complexfloating[_NBit_g, _NBit_g] | np.complex128 | np.complex64
18+
_Sca_f: TypeAlias = (
19+
np.floating[_128Bit]
20+
| np.floating[_96Bit]
21+
| np.float64
22+
| np.float32
23+
| np.float16
24+
) # fmt: skip
25+
_Sca_c: TypeAlias = (
26+
np.complexfloating[_128Bit, _128Bit]
27+
| np.complexfloating[_96Bit, _96Bit]
28+
| np.complex128
29+
| np.complex64
30+
)
2231
_Sca_f8: TypeAlias = np.float64
2332
_Sca_c16: TypeAlias = np.complex128
2433
_Sca_i_co: TypeAlias = _Sca_i | _Sca_b
@@ -40,7 +49,7 @@ _Val_c_co: TypeAlias = _Sca_c_co | complex
4049
_Val_f8_co: TypeAlias = _Sca_f8_co | float
4150
_Val_c16_co: TypeAlias = _Sca_c16_co | complex
4251

43-
_Arr0_x_co: TypeAlias = onp.CanArray0D[_Sca_x]
52+
_Arr0_x: TypeAlias = onp.CanArray0D[_Sca_x]
4453
_Arr0_b: TypeAlias = onp.CanArray0D[_Sca_b]
4554
_Arr0_i: TypeAlias = onp.CanArray0D[_Sca_i]
4655
_Arr0_f: TypeAlias = onp.CanArray0D[_Sca_f]
@@ -53,44 +62,44 @@ _Arr0_c_co: TypeAlias = onp.CanArray0D[_Sca_c_co]
5362
_Arr0_f8_co: TypeAlias = onp.CanArray0D[_Sca_f8_co]
5463
_Arr0_c16_co: TypeAlias = onp.CanArray0D[_Sca_c16_co]
5564

56-
_Arr1_x: TypeAlias = onp.CanArray1D[_Sca_x] | Seq[_Arr0_x_co | _Val_x]
57-
_Arr1_b: TypeAlias = onp.CanArray1D[_Sca_b] | Seq[_Arr0_b | _Val_b]
58-
_Arr1_i: TypeAlias = onp.CanArray1D[_Sca_i] | Seq[_Arr0_i | _Val_i]
59-
_Arr1_f: TypeAlias = onp.CanArray1D[_Sca_f] | Seq[_Arr0_f | _Val_f]
60-
_Arr1_c: TypeAlias = onp.CanArray1D[_Sca_c] | Seq[_Arr0_c | _Val_c]
61-
_Arr1_f8: TypeAlias = onp.CanArray1D[_Sca_f8] | Seq[_Arr0_f8 | _Val_f8]
62-
_Arr1_c16: TypeAlias = onp.CanArray1D[_Sca_c16] | Seq[_Arr0_c16 | _Val_c16]
63-
_Arr1_i_co: TypeAlias = onp.CanArray1D[_Sca_i_co] | Seq[_Arr0_i_co | _Val_i_co]
64-
_Arr1_f_co: TypeAlias = onp.CanArray1D[_Sca_f_co] | Seq[_Arr0_f_co | _Val_f_co]
65-
_Arr1_c_co: TypeAlias = onp.CanArray1D[_Sca_c_co] | Seq[_Arr0_c_co | _Val_c_co]
66-
_Arr1_f8_co: TypeAlias = onp.CanArray1D[_Sca_f8_co] | Seq[_Arr0_f8_co | _Val_f8_co]
67-
_Arr1_c16_co: TypeAlias = onp.CanArray1D[_Sca_c16_co] | Seq[_Arr0_c16_co | _Val_c16_co]
68-
69-
_Arr2_x: TypeAlias = onp.CanArray2D[_Sca_x] | Seq[_Arr1_x]
70-
_Arr2_b: TypeAlias = onp.CanArray2D[_Sca_b] | Seq[_Arr1_b]
71-
_Arr2_i: TypeAlias = onp.CanArray2D[_Sca_i] | Seq[_Arr1_i]
72-
_Arr2_f: TypeAlias = onp.CanArray2D[_Sca_f] | Seq[_Arr1_f]
73-
_Arr2_c: TypeAlias = onp.CanArray2D[_Sca_c] | Seq[_Arr1_c]
74-
_Arr2_f8: TypeAlias = onp.CanArray2D[_Sca_f8] | Seq[_Arr1_f8]
75-
_Arr2_c16: TypeAlias = onp.CanArray2D[_Sca_c16] | Seq[_Arr1_c16]
76-
_Arr2_i_co: TypeAlias = onp.CanArray2D[_Sca_i_co] | Seq[_Arr1_i_co]
77-
_Arr2_f_co: TypeAlias = onp.CanArray2D[_Sca_f_co] | Seq[_Arr1_f_co]
78-
_Arr2_c_co: TypeAlias = onp.CanArray2D[_Sca_c_co] | Seq[_Arr1_c_co]
79-
_Arr2_f8_co: TypeAlias = onp.CanArray2D[_Sca_f8_co] | Seq[_Arr1_f8_co]
80-
_Arr2_c16_co: TypeAlias = onp.CanArray2D[_Sca_c16_co] | Seq[_Arr1_c16_co]
81-
82-
_Arr3_x: TypeAlias = onp.CanArray3D[_Sca_x] | Seq[_Arr2_x]
83-
_Arr3_b: TypeAlias = onp.CanArray3D[_Sca_b] | Seq[_Arr2_b]
84-
_Arr3_i: TypeAlias = onp.CanArray3D[_Sca_i] | Seq[_Arr2_i]
85-
_Arr3_f: TypeAlias = onp.CanArray3D[_Sca_f] | Seq[_Arr2_f]
86-
_Arr3_c: TypeAlias = onp.CanArray3D[_Sca_c] | Seq[_Arr2_c]
87-
_Arr3_f8: TypeAlias = onp.CanArray3D[_Sca_f8] | Seq[_Arr2_f8]
88-
_Arr3_c16: TypeAlias = onp.CanArray3D[_Sca_c16] | Seq[_Arr2_c16]
89-
_Arr3_i_co: TypeAlias = onp.CanArray3D[_Sca_i_co] | Seq[_Arr2_i_co]
90-
_Arr3_f_co: TypeAlias = onp.CanArray3D[_Sca_f_co] | Seq[_Arr2_f_co]
91-
_Arr3_c_co: TypeAlias = onp.CanArray3D[_Sca_c_co] | Seq[_Arr2_c_co]
92-
_Arr3_f8_co: TypeAlias = onp.CanArray3D[_Sca_f8_co] | Seq[_Arr2_f8_co]
93-
_Arr3_c16_co: TypeAlias = onp.CanArray3D[_Sca_c16_co] | Seq[_Arr2_c16_co]
65+
_Arr1_x: TypeAlias = onp.Array1D[_Sca_x] | Seq[_Sca_x | _Val_x]
66+
_Arr1_b: TypeAlias = onp.Array1D[_Sca_b] | Seq[_Sca_b | _Val_b]
67+
_Arr1_i: TypeAlias = onp.Array1D[_Sca_i] | Seq[_Sca_i | _Val_i]
68+
_Arr1_f: TypeAlias = onp.Array1D[_Sca_f] | Seq[_Sca_f | _Val_f]
69+
_Arr1_c: TypeAlias = onp.Array1D[_Sca_c] | Seq[_Sca_c | _Val_c]
70+
_Arr1_f8: TypeAlias = onp.Array1D[_Sca_f8] | Seq[_Sca_f8 | _Val_f8]
71+
_Arr1_c16: TypeAlias = onp.Array1D[_Sca_c16] | Seq[_Sca_c16 | _Val_c16]
72+
_Arr1_i_co: TypeAlias = onp.Array1D[_Sca_i_co] | Seq[_Sca_i_co | _Val_i_co]
73+
_Arr1_f_co: TypeAlias = onp.Array1D[_Sca_f_co] | Seq[_Sca_f_co | _Val_f_co]
74+
_Arr1_c_co: TypeAlias = onp.Array1D[_Sca_c_co] | Seq[_Sca_c_co | _Val_c_co]
75+
_Arr1_f8_co: TypeAlias = onp.Array1D[_Sca_f8_co] | Seq[_Sca_f8_co | _Val_f8_co]
76+
_Arr1_c16_co: TypeAlias = onp.Array1D[_Sca_c16_co] | Seq[_Sca_c16_co | _Val_c16_co]
77+
78+
_Arr2_x: TypeAlias = onp.Array2D[_Sca_x] | Seq[_Arr1_x]
79+
_Arr2_b: TypeAlias = onp.Array2D[_Sca_b] | Seq[_Arr1_b]
80+
_Arr2_i: TypeAlias = onp.Array2D[_Sca_i] | Seq[_Arr1_i]
81+
_Arr2_f: TypeAlias = onp.Array2D[_Sca_f] | Seq[_Arr1_f]
82+
_Arr2_c: TypeAlias = onp.Array2D[_Sca_c] | Seq[_Arr1_c]
83+
_Arr2_f8: TypeAlias = onp.Array2D[_Sca_f8] | Seq[_Arr1_f8]
84+
_Arr2_c16: TypeAlias = onp.Array2D[_Sca_c16] | Seq[_Arr1_c16]
85+
_Arr2_i_co: TypeAlias = onp.Array2D[_Sca_i_co] | Seq[_Arr1_i_co]
86+
_Arr2_f_co: TypeAlias = onp.Array2D[_Sca_f_co] | Seq[_Arr1_f_co]
87+
_Arr2_c_co: TypeAlias = onp.Array2D[_Sca_c_co] | Seq[_Arr1_c_co]
88+
_Arr2_f8_co: TypeAlias = onp.Array2D[_Sca_f8_co] | Seq[_Arr1_f8_co]
89+
_Arr2_c16_co: TypeAlias = onp.Array2D[_Sca_c16_co] | Seq[_Arr1_c16_co]
90+
91+
_Arr3_x: TypeAlias = onp.Array3D[_Sca_x] | Seq[_Arr2_x]
92+
_Arr3_b: TypeAlias = onp.Array3D[_Sca_b] | Seq[_Arr2_b]
93+
_Arr3_i: TypeAlias = onp.Array3D[_Sca_i] | Seq[_Arr2_i]
94+
_Arr3_f: TypeAlias = onp.Array3D[_Sca_f] | Seq[_Arr2_f]
95+
_Arr3_c: TypeAlias = onp.Array3D[_Sca_c] | Seq[_Arr2_c]
96+
_Arr3_f8: TypeAlias = onp.Array3D[_Sca_f8] | Seq[_Arr2_f8]
97+
_Arr3_c16: TypeAlias = onp.Array3D[_Sca_c16] | Seq[_Arr2_c16]
98+
_Arr3_i_co: TypeAlias = onp.Array3D[_Sca_i_co] | Seq[_Arr2_i_co]
99+
_Arr3_f_co: TypeAlias = onp.Array3D[_Sca_f_co] | Seq[_Arr2_f_co]
100+
_Arr3_c_co: TypeAlias = onp.Array3D[_Sca_c_co] | Seq[_Arr2_c_co]
101+
_Arr3_f8_co: TypeAlias = onp.Array3D[_Sca_f8_co] | Seq[_Arr2_f8_co]
102+
_Arr3_c16_co: TypeAlias = onp.Array3D[_Sca_c16_co] | Seq[_Arr2_c16_co]
94103

95104
x_: _Val_x
96105
b_: _Val_b
@@ -105,7 +114,7 @@ c_co: _Val_c_co
105114
f8_co: _Val_f8_co
106115
c16_co: _Val_c16_co
107116

108-
x_0d: _Arr0_x_co | _Val_x
117+
x_0d: _Arr0_x | _Val_x
109118
b_0d: _Arr0_b | _Val_b
110119
i_0d: _Arr0_i | _Val_i
111120
f_0d: _Arr0_f | _Val_f

uv.lock

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)