Skip to content

Commit 45c2d1f

Browse files
committed
ENH: rm __array__, add __buffer__
1 parent 9eebf2c commit 45c2d1f

File tree

1 file changed

+12
-25
lines changed

1 file changed

+12
-25
lines changed

array_api_strict/_array_object.py

Lines changed: 12 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,7 @@ def __hash__(self) -> int:
6767
CPU_DEVICE = Device()
6868
ALL_DEVICES = (CPU_DEVICE, Device("device1"), Device("device2"))
6969

70-
# See https://github.com/data-apis/array-api-strict/issues/67 and the comment
71-
# on __array__ below.
72-
_allow_array = True
70+
_default = object()
7371

7472

7573
class Array:
@@ -163,28 +161,17 @@ def __repr__(self) -> str:
163161
# This was implemented historically for compatibility, and removing it has
164162
# caused issues for some libraries (see
165163
# https://github.com/data-apis/array-api-strict/issues/67).
166-
def __array__(
167-
self, dtype: None | np.dtype[Any] = None, copy: None | bool = None
168-
) -> npt.NDArray[Any]:
169-
# We have to allow this to be internally enabled as there's no other
170-
# easy way to parse a list of Array objects in asarray().
171-
if _allow_array:
172-
if self._device != CPU_DEVICE:
173-
raise RuntimeError(f"Can not convert array on the '{self._device}' device to a Numpy array.")
174-
# copy keyword is new in 2.0.0; for older versions don't use it
175-
# retry without that keyword.
176-
if np.__version__[0] < '2':
177-
return np.asarray(self._array, dtype=dtype)
178-
elif np.__version__.startswith('2.0.0-dev0'):
179-
# Handle dev version for which we can't know based on version
180-
# number whether or not the copy keyword is supported.
181-
try:
182-
return np.asarray(self._array, dtype=dtype, copy=copy)
183-
except TypeError:
184-
return np.asarray(self._array, dtype=dtype)
185-
else:
186-
return np.asarray(self._array, dtype=dtype, copy=copy)
187-
raise ValueError("Conversion from an array_api_strict array to a NumPy ndarray is not supported")
164+
165+
# Instead of `__array__` we now implement the buffer protocol.
166+
# Note that it makes array-apis-strict requiring python>=3.12
167+
def __buffer__(self, flags):
168+
print('__buffer__')
169+
if self._device != CPU_DEVICE:
170+
raise RuntimeError(f"Can not convert array on the '{self._device}' device to a Numpy array.")
171+
return memoryview(self._array)
172+
def __release_buffer(self, buffer):
173+
print('__release__')
174+
# XXX anything to do here?
188175

189176
# These are various helper functions to make the array behavior match the
190177
# spec in places where it either deviates from or is more strict than

0 commit comments

Comments
 (0)