Skip to content

Commit 7456ea7

Browse files
committed
✨ HasShape
1 parent 79a1b10 commit 7456ea7

File tree

3 files changed

+31
-0
lines changed

3 files changed

+31
-0
lines changed

src/array_api_typing/_array.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,12 +111,34 @@ def ndim(self) -> int:
111111
...
112112

113113

114+
class HasShape(Protocol):
115+
"""Protocol for array classes that have a shape attribute."""
116+
117+
@property
118+
def shape(self) -> tuple[int | None, ...]:
119+
"""Shape of the array.
120+
121+
Returns:
122+
tuple[int | None, ...]: array dimensions. An array dimension must be None
123+
if and only if a dimension is unknown.
124+
125+
Notes:
126+
For array libraries having graph-based computational models, array
127+
dimensions may be unknown due to data-dependent operations (e.g.,
128+
boolean indexing; `A[:, B > 0]`) and thus cannot be statically
129+
resolved without knowing array contents.
130+
131+
"""
132+
...
133+
134+
114135
class Array(
115136
# ------ Attributes -------
116137
HasDType[DTypeT_co],
117138
HasDevice,
118139
HasMatrixTranspose,
119140
HasNDim,
141+
HasShape,
120142
# ------- Methods ---------
121143
HasArrayNamespace[NamespaceT_co],
122144
# -------------------------

tests/integration/test_numpy1p0.pyi

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,3 +67,7 @@ _: xpt.Array[dtype[Any]] = x_i32.mT
6767
# Check Attribute `.ndim`
6868
_: int = x_f32.ndim
6969
_: int = x_i32.ndim
70+
71+
# Check Attribute `.shape`
72+
_: tuple[int | None, ...] = x_f32.shape
73+
_: tuple[int | None, ...] = x_i32.shape

tests/integration/test_numpy2p0.pyi

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,3 +76,8 @@ _: xpt.Array[np.dtype[B]] = x_b.mT
7676
_: int = x_f32.ndim
7777
_: int = x_i32.ndim
7878
_: int = x_b.ndim
79+
80+
# Check Attribute `.shape`
81+
_: tuple[int | None, ...] = x_f32.shape
82+
_: tuple[int | None, ...] = x_i32.shape
83+
_: tuple[int | None, ...] = x_b.shape

0 commit comments

Comments
 (0)