dlpack — Python array API standard 2024.12 documentation (original) (raw)

array.__dlpack__(*, stream: int | Any | None = None, max_version: tuple[int, int] | None = None, dl_device: tuple[Enum, int] | None = None, copy: bool | None = None) → PyCapsule

Exports the array for consumption by from_dlpack() as a DLPack capsule.

Parameters:

Returns:

capsule (PyCapsule) – a DLPack capsule for the array. See Data interchange mechanisms for details.

Raises:

BufferError – Implementations should raise BufferError when the data cannot be exported as DLPack (e.g., incompatible dtype or strides). Other errors are raised when export fails for other reasons (e.g., incorrect arguments passed or out of memory).

Notes

The DLPack version scheme is SemVer, where the major DLPack versions represent ABI breaks, and minor versions represent ABI-compatible additions (e.g., new enum values for new data types or device types).

The max_version keyword was introduced in v2023.12, and goes together with the DLManagedTensorVersioned struct added in DLPack 1.0. This keyword may not be used by consumers until a later time after introduction, because producers may implement the support at a different point in time.

It is recommended for the producer to use this logic in the implementation of __dlpack__:

if max_version is None: # Keep and use the DLPack 0.X implementation # Note: from March 2025 onwards (but ideally as late as # possible), it's okay to raise BufferError here else: # We get to produce DLManagedTensorVersioned now. Note that # our_own_dlpack_version is the max version that the producer # supports and fills in the DLManagedTensorVersioned::version # field if max_version >= our_own_dlpack_version: # Consumer understands us, just return a Capsule with our max version elif max_version[0] == our_own_dlpack_version[0]: # major versions match, we should still be fine here - # return our own max version else: # if we're at a higher major version internally, did we # keep an implementation of the older major version around? # For example, if the producer is on DLPack 1.x and the consumer # is 0.y, can the producer still export a capsule containing # DLManagedTensor and not DLManagedTensorVersioned? # If so, use that. Else, the producer should raise a BufferError # here to tell users that the consumer's max_version is too # old to allow the data exchange to happen.

And this logic for the consumer in from_dlpack():

try: x.dlpack(max_version=(1, 0), ...) # if it succeeds, store info from the capsule named "dltensor_versioned", # and need to set the name to "used_dltensor_versioned" when we're done except TypeError: x.dlpack(...)

This logic is also applicable to handling of the new dl_device and copykeywords.

DLPack 1.0 added a flag to indicate that the array is read-only (DLPACK_FLAG_BITMASK_READ_ONLY). A consumer that does not support read-only arrays should ignore this flag (this is preferred over raising an exception; the user is then responsible for ensuring the memory isn’t modified).

Changed in version 2022.12: Added BufferError.

Changed in version 2023.12: Added the max_version, dl_device, and copy keyword arguments.

Changed in version 2023.12: Added recommendation for handling read-only arrays.

Changed in version 2024.12: Resolved conflicting exception guidance.