Skip to content

Commit b37a310

Browse files
committed
✨ HasShape
1 parent 408ad5b commit b37a310

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
@@ -112,12 +112,34 @@ def ndim(self) -> int:
112112
...
113113

114114

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

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)