Skip to content

Commit 4798582

Browse files
committed
Add an AnyAsyncArray type
1 parent 1ca9e9b commit 4798582

File tree

6 files changed

+83
-127
lines changed

6 files changed

+83
-127
lines changed

src/zarr/api/asynchronous.py

Lines changed: 16 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
GroupMetadata,
3838
create_hierarchy,
3939
)
40-
from zarr.core.metadata import ArrayMetadataDict, ArrayV2Metadata, ArrayV3Metadata
40+
from zarr.core.metadata import ArrayMetadataDict, ArrayV2Metadata
4141
from zarr.errors import (
4242
ArrayNotFoundError,
4343
GroupNotFoundError,
@@ -58,12 +58,10 @@
5858
from zarr.core.chunk_key_encodings import ChunkKeyEncoding
5959
from zarr.core.metadata.v2 import CompressorLikev2
6060
from zarr.storage import StoreLike
61-
from zarr.types import AnyArray
61+
from zarr.types import AnyArray, AnyAsyncArray
6262

6363
# TODO: this type could use some more thought
64-
ArrayLike: TypeAlias = (
65-
AsyncArray[ArrayV2Metadata] | AsyncArray[ArrayV3Metadata] | AnyArray | npt.NDArray[Any]
66-
)
64+
ArrayLike: TypeAlias = AnyAsyncArray | AnyArray | npt.NDArray[Any]
6765
PathLike = str
6866

6967
__all__ = [
@@ -338,7 +336,7 @@ async def open(
338336
path: str | None = None,
339337
storage_options: dict[str, Any] | None = None,
340338
**kwargs: Any, # TODO: type kwargs as valid args to open_array
341-
) -> AsyncArray[ArrayV2Metadata] | AsyncArray[ArrayV3Metadata] | AsyncGroup:
339+
) -> AnyAsyncArray | AsyncGroup:
342340
"""Convenience function to open a group or array using file-mode-like semantics.
343341
344342
Parameters
@@ -604,9 +602,7 @@ async def tree(grp: AsyncGroup, expand: bool | None = None, level: int | None =
604602
return await grp.tree(expand=expand, level=level)
605603

606604

607-
async def array(
608-
data: npt.ArrayLike | AnyArray, **kwargs: Any
609-
) -> AsyncArray[ArrayV2Metadata] | AsyncArray[ArrayV3Metadata]:
605+
async def array(data: npt.ArrayLike | AnyArray, **kwargs: Any) -> AnyAsyncArray:
610606
"""Create an array filled with `data`.
611607
612608
Parameters
@@ -922,7 +918,7 @@ async def create(
922918
storage_options: dict[str, Any] | None = None,
923919
config: ArrayConfigLike | None = None,
924920
**kwargs: Any,
925-
) -> AsyncArray[ArrayV2Metadata] | AsyncArray[ArrayV3Metadata]:
921+
) -> AnyAsyncArray:
926922
"""Create an array.
927923
928924
Parameters
@@ -1109,9 +1105,7 @@ async def create(
11091105
)
11101106

11111107

1112-
async def empty(
1113-
shape: tuple[int, ...], **kwargs: Any
1114-
) -> AsyncArray[ArrayV2Metadata] | AsyncArray[ArrayV3Metadata]:
1108+
async def empty(shape: tuple[int, ...], **kwargs: Any) -> AnyAsyncArray:
11151109
"""Create an empty array with the specified shape. The contents will be filled with the
11161110
specified fill value or zeros if no fill value is provided.
11171111
@@ -1131,9 +1125,7 @@ async def empty(
11311125
return await create(shape=shape, **kwargs)
11321126

11331127

1134-
async def empty_like(
1135-
a: ArrayLike, **kwargs: Any
1136-
) -> AsyncArray[ArrayV2Metadata] | AsyncArray[ArrayV3Metadata]:
1128+
async def empty_like(a: ArrayLike, **kwargs: Any) -> AnyAsyncArray:
11371129
"""Create an empty array like `a`. The contents will be filled with the
11381130
array's fill value or zeros if no fill value is provided.
11391131
@@ -1162,9 +1154,7 @@ async def empty_like(
11621154

11631155

11641156
# TODO: add type annotations for fill_value and kwargs
1165-
async def full(
1166-
shape: tuple[int, ...], fill_value: Any, **kwargs: Any
1167-
) -> AsyncArray[ArrayV2Metadata] | AsyncArray[ArrayV3Metadata]:
1157+
async def full(shape: tuple[int, ...], fill_value: Any, **kwargs: Any) -> AnyAsyncArray:
11681158
"""Create an array, with `fill_value` being used as the default value for
11691159
uninitialized portions of the array.
11701160
@@ -1186,9 +1176,7 @@ async def full(
11861176

11871177

11881178
# TODO: add type annotations for kwargs
1189-
async def full_like(
1190-
a: ArrayLike, **kwargs: Any
1191-
) -> AsyncArray[ArrayV2Metadata] | AsyncArray[ArrayV3Metadata]:
1179+
async def full_like(a: ArrayLike, **kwargs: Any) -> AnyAsyncArray:
11921180
"""Create a filled array like `a`.
11931181
11941182
Parameters
@@ -1209,9 +1197,7 @@ async def full_like(
12091197
return await full(**like_kwargs) # type: ignore[arg-type]
12101198

12111199

1212-
async def ones(
1213-
shape: tuple[int, ...], **kwargs: Any
1214-
) -> AsyncArray[ArrayV2Metadata] | AsyncArray[ArrayV3Metadata]:
1200+
async def ones(shape: tuple[int, ...], **kwargs: Any) -> AnyAsyncArray:
12151201
"""Create an array, with one being used as the default value for
12161202
uninitialized portions of the array.
12171203
@@ -1230,9 +1216,7 @@ async def ones(
12301216
return await create(shape=shape, fill_value=1, **kwargs)
12311217

12321218

1233-
async def ones_like(
1234-
a: ArrayLike, **kwargs: Any
1235-
) -> AsyncArray[ArrayV2Metadata] | AsyncArray[ArrayV3Metadata]:
1219+
async def ones_like(a: ArrayLike, **kwargs: Any) -> AnyAsyncArray:
12361220
"""Create an array of ones like `a`.
12371221
12381222
Parameters
@@ -1259,7 +1243,7 @@ async def open_array(
12591243
path: PathLike = "",
12601244
storage_options: dict[str, Any] | None = None,
12611245
**kwargs: Any, # TODO: type kwargs as valid args to save
1262-
) -> AsyncArray[ArrayV2Metadata] | AsyncArray[ArrayV3Metadata]:
1246+
) -> AnyAsyncArray:
12631247
"""Open an array using file-mode-like semantics.
12641248
12651249
Parameters
@@ -1310,9 +1294,7 @@ async def open_array(
13101294
raise ArrayNotFoundError(msg) from err
13111295

13121296

1313-
async def open_like(
1314-
a: ArrayLike, path: str, **kwargs: Any
1315-
) -> AsyncArray[ArrayV3Metadata] | AsyncArray[ArrayV2Metadata]:
1297+
async def open_like(a: ArrayLike, path: str, **kwargs: Any) -> AnyAsyncArray:
13161298
"""Open a persistent array like `a`.
13171299
13181300
Parameters
@@ -1335,9 +1317,7 @@ async def open_like(
13351317
return await open_array(path=path, **like_kwargs) # type: ignore[arg-type]
13361318

13371319

1338-
async def zeros(
1339-
shape: tuple[int, ...], **kwargs: Any
1340-
) -> AsyncArray[ArrayV2Metadata] | AsyncArray[ArrayV3Metadata]:
1320+
async def zeros(shape: tuple[int, ...], **kwargs: Any) -> AnyAsyncArray:
13411321
"""Create an array, with zero being used as the default value for
13421322
uninitialized portions of the array.
13431323
@@ -1356,9 +1336,7 @@ async def zeros(
13561336
return await create(shape=shape, fill_value=0, **kwargs)
13571337

13581338

1359-
async def zeros_like(
1360-
a: ArrayLike, **kwargs: Any
1361-
) -> AsyncArray[ArrayV2Metadata] | AsyncArray[ArrayV3Metadata]:
1339+
async def zeros_like(a: ArrayLike, **kwargs: Any) -> AnyAsyncArray:
13621340
"""Create an array of zeros like `a`.
13631341
13641342
Parameters

src/zarr/core/array.py

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@
144144
from zarr.codecs.sharding import ShardingCodecIndexLocation
145145
from zarr.core.dtype.wrapper import TBaseDType, TBaseScalar
146146
from zarr.storage import StoreLike
147-
from zarr.types import AnyArray
147+
from zarr.types import AnyArray, AnyAsyncArray
148148

149149

150150
# Array and AsyncArray are defined in the base ``zarr`` namespace
@@ -456,7 +456,7 @@ async def create(
456456
overwrite: bool = False,
457457
data: npt.ArrayLike | None = None,
458458
config: ArrayConfigLike | None = None,
459-
) -> AsyncArray[ArrayV3Metadata] | AsyncArray[ArrayV2Metadata]: ...
459+
) -> AnyAsyncArray: ...
460460

461461
@classmethod
462462
@deprecated("Use zarr.api.asynchronous.create_array instead.", category=ZarrDeprecationWarning)
@@ -490,7 +490,7 @@ async def create(
490490
overwrite: bool = False,
491491
data: npt.ArrayLike | None = None,
492492
config: ArrayConfigLike | None = None,
493-
) -> AsyncArray[ArrayV2Metadata] | AsyncArray[ArrayV3Metadata]:
493+
) -> AnyAsyncArray:
494494
"""Method to create a new asynchronous array instance.
495495
496496
!!! warning "Deprecated"
@@ -641,7 +641,7 @@ async def _create(
641641
overwrite: bool = False,
642642
data: npt.ArrayLike | None = None,
643643
config: ArrayConfigLike | None = None,
644-
) -> AsyncArray[ArrayV2Metadata] | AsyncArray[ArrayV3Metadata]:
644+
) -> AnyAsyncArray:
645645
"""Method to create a new asynchronous array instance.
646646
Deprecated in favor of [`zarr.api.asynchronous.create_array`][].
647647
"""
@@ -662,7 +662,7 @@ async def _create(
662662
_chunks = normalize_chunks(chunk_shape, shape, item_size)
663663
config_parsed = parse_array_config(config)
664664

665-
result: AsyncArray[ArrayV3Metadata] | AsyncArray[ArrayV2Metadata]
665+
result: AnyAsyncArray
666666
if zarr_format == 3:
667667
if dimension_separator is not None:
668668
raise ValueError(
@@ -931,7 +931,7 @@ def from_dict(
931931
cls,
932932
store_path: StorePath,
933933
data: dict[str, JSON],
934-
) -> AsyncArray[ArrayV3Metadata] | AsyncArray[ArrayV2Metadata]:
934+
) -> AnyAsyncArray:
935935
"""
936936
Create a Zarr array from a dictionary, with support for both Zarr format 2 and 3 metadata.
937937
@@ -963,7 +963,7 @@ async def open(
963963
cls,
964964
store: StoreLike,
965965
zarr_format: ZarrFormat | None = 3,
966-
) -> AsyncArray[ArrayV3Metadata] | AsyncArray[ArrayV2Metadata]:
966+
) -> AnyAsyncArray:
967967
"""
968968
Async method to open an existing Zarr array from a given store.
969969
@@ -4170,7 +4170,7 @@ def info_complete(self) -> Any:
41704170

41714171

41724172
async def _shards_initialized(
4173-
array: AsyncArray[ArrayV2Metadata] | AsyncArray[ArrayV3Metadata],
4173+
array: AnyAsyncArray,
41744174
) -> tuple[str, ...]:
41754175
"""
41764176
Return the keys of the chunks that have been persisted to the storage backend.
@@ -4251,7 +4251,7 @@ async def from_array(
42514251
storage_options: dict[str, Any] | None = None,
42524252
overwrite: bool = False,
42534253
config: ArrayConfigLike | None = None,
4254-
) -> AsyncArray[ArrayV2Metadata] | AsyncArray[ArrayV3Metadata]:
4254+
) -> AnyAsyncArray:
42554255
"""Create an array from an existing array or array-like.
42564256
42574257
Parameters
@@ -4519,7 +4519,7 @@ async def init_array(
45194519
dimension_names: DimensionNames = None,
45204520
overwrite: bool = False,
45214521
config: ArrayConfigLike | None = None,
4522-
) -> AsyncArray[ArrayV3Metadata] | AsyncArray[ArrayV2Metadata]:
4522+
) -> AnyAsyncArray:
45234523
"""Create and persist an array metadata document.
45244524
45254525
Parameters
@@ -4737,7 +4737,7 @@ async def create_array(
47374737
overwrite: bool = False,
47384738
config: ArrayConfigLike | None = None,
47394739
write_data: bool = True,
4740-
) -> AsyncArray[ArrayV2Metadata] | AsyncArray[ArrayV3Metadata]:
4740+
) -> AnyAsyncArray:
47414741
"""Create an array.
47424742
47434743
Parameters
@@ -5285,7 +5285,7 @@ def _parse_data_params(
52855285

52865286

52875287
def _iter_chunk_coords(
5288-
array: AnyArray | AsyncArray[Any],
5288+
array: AnyArray | AnyAsyncArray,
52895289
*,
52905290
origin: Sequence[int] | None = None,
52915291
selection_shape: Sequence[int] | None = None,
@@ -5316,7 +5316,7 @@ def _iter_chunk_coords(
53165316

53175317

53185318
def _iter_shard_coords(
5319-
array: AnyArray | AsyncArray[Any],
5319+
array: AnyArray | AnyAsyncArray,
53205320
*,
53215321
origin: Sequence[int] | None = None,
53225322
selection_shape: Sequence[int] | None = None,
@@ -5347,7 +5347,7 @@ def _iter_shard_coords(
53475347

53485348

53495349
def _iter_shard_keys(
5350-
array: AnyArray | AsyncArray[Any],
5350+
array: AnyArray | AnyAsyncArray,
53515351
*,
53525352
origin: Sequence[int] | None = None,
53535353
selection_shape: Sequence[int] | None = None,
@@ -5376,7 +5376,7 @@ def _iter_shard_keys(
53765376

53775377

53785378
def _iter_shard_regions(
5379-
array: AnyArray | AsyncArray[Any],
5379+
array: AnyArray | AnyAsyncArray,
53805380
*,
53815381
origin: Sequence[int] | None = None,
53825382
selection_shape: Sequence[int] | None = None,
@@ -5411,7 +5411,7 @@ def _iter_shard_regions(
54115411

54125412

54135413
def _iter_chunk_regions(
5414-
array: AnyArray | AsyncArray[Any],
5414+
array: AnyArray | AnyAsyncArray,
54155415
*,
54165416
origin: Sequence[int] | None = None,
54175417
selection_shape: Sequence[int] | None = None,

0 commit comments

Comments
 (0)