Skip to content

Commit a0ddd2e

Browse files
committed
Add an AnyAsyncArray type
1 parent eb3c3b3 commit a0ddd2e

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__ = [
@@ -334,7 +332,7 @@ async def open(
334332
path: str | None = None,
335333
storage_options: dict[str, Any] | None = None,
336334
**kwargs: Any, # TODO: type kwargs as valid args to open_array
337-
) -> AsyncArray[ArrayV2Metadata] | AsyncArray[ArrayV3Metadata] | AsyncGroup:
335+
) -> AnyAsyncArray | AsyncGroup:
338336
"""Convenience function to open a group or array using file-mode-like semantics.
339337
340338
Parameters
@@ -592,9 +590,7 @@ async def tree(grp: AsyncGroup, expand: bool | None = None, level: int | None =
592590
return await grp.tree(expand=expand, level=level)
593591

594592

595-
async def array(
596-
data: npt.ArrayLike | AnyArray, **kwargs: Any
597-
) -> AsyncArray[ArrayV2Metadata] | AsyncArray[ArrayV3Metadata]:
593+
async def array(data: npt.ArrayLike | AnyArray, **kwargs: Any) -> AnyAsyncArray:
598594
"""Create an array filled with `data`.
599595
600596
Parameters
@@ -912,7 +908,7 @@ async def create(
912908
storage_options: dict[str, Any] | None = None,
913909
config: ArrayConfigLike | None = None,
914910
**kwargs: Any,
915-
) -> AsyncArray[ArrayV2Metadata] | AsyncArray[ArrayV3Metadata]:
911+
) -> AnyAsyncArray:
916912
"""Create an array.
917913
918914
Parameters
@@ -1097,9 +1093,7 @@ async def create(
10971093
)
10981094

10991095

1100-
async def empty(
1101-
shape: tuple[int, ...], **kwargs: Any
1102-
) -> AsyncArray[ArrayV2Metadata] | AsyncArray[ArrayV3Metadata]:
1096+
async def empty(shape: tuple[int, ...], **kwargs: Any) -> AnyAsyncArray:
11031097
"""Create an empty array with the specified shape. The contents will be filled with the
11041098
specified fill value or zeros if no fill value is provided.
11051099
@@ -1119,9 +1113,7 @@ async def empty(
11191113
return await create(shape=shape, **kwargs)
11201114

11211115

1122-
async def empty_like(
1123-
a: ArrayLike, **kwargs: Any
1124-
) -> AsyncArray[ArrayV2Metadata] | AsyncArray[ArrayV3Metadata]:
1116+
async def empty_like(a: ArrayLike, **kwargs: Any) -> AnyAsyncArray:
11251117
"""Create an empty array like `a`. The contents will be filled with the
11261118
array's fill value or zeros if no fill value is provided.
11271119
@@ -1150,9 +1142,7 @@ async def empty_like(
11501142

11511143

11521144
# TODO: add type annotations for fill_value and kwargs
1153-
async def full(
1154-
shape: tuple[int, ...], fill_value: Any, **kwargs: Any
1155-
) -> AsyncArray[ArrayV2Metadata] | AsyncArray[ArrayV3Metadata]:
1145+
async def full(shape: tuple[int, ...], fill_value: Any, **kwargs: Any) -> AnyAsyncArray:
11561146
"""Create an array, with `fill_value` being used as the default value for
11571147
uninitialized portions of the array.
11581148
@@ -1174,9 +1164,7 @@ async def full(
11741164

11751165

11761166
# TODO: add type annotations for kwargs
1177-
async def full_like(
1178-
a: ArrayLike, **kwargs: Any
1179-
) -> AsyncArray[ArrayV2Metadata] | AsyncArray[ArrayV3Metadata]:
1167+
async def full_like(a: ArrayLike, **kwargs: Any) -> AnyAsyncArray:
11801168
"""Create a filled array like `a`.
11811169
11821170
Parameters
@@ -1197,9 +1185,7 @@ async def full_like(
11971185
return await full(**like_kwargs) # type: ignore[arg-type]
11981186

11991187

1200-
async def ones(
1201-
shape: tuple[int, ...], **kwargs: Any
1202-
) -> AsyncArray[ArrayV2Metadata] | AsyncArray[ArrayV3Metadata]:
1188+
async def ones(shape: tuple[int, ...], **kwargs: Any) -> AnyAsyncArray:
12031189
"""Create an array, with one being used as the default value for
12041190
uninitialized portions of the array.
12051191
@@ -1218,9 +1204,7 @@ async def ones(
12181204
return await create(shape=shape, fill_value=1, **kwargs)
12191205

12201206

1221-
async def ones_like(
1222-
a: ArrayLike, **kwargs: Any
1223-
) -> AsyncArray[ArrayV2Metadata] | AsyncArray[ArrayV3Metadata]:
1207+
async def ones_like(a: ArrayLike, **kwargs: Any) -> AnyAsyncArray:
12241208
"""Create an array of ones like `a`.
12251209
12261210
Parameters
@@ -1247,7 +1231,7 @@ async def open_array(
12471231
path: PathLike = "",
12481232
storage_options: dict[str, Any] | None = None,
12491233
**kwargs: Any, # TODO: type kwargs as valid args to save
1250-
) -> AsyncArray[ArrayV2Metadata] | AsyncArray[ArrayV3Metadata]:
1234+
) -> AnyAsyncArray:
12511235
"""Open an array using file-mode-like semantics.
12521236
12531237
Parameters
@@ -1296,9 +1280,7 @@ async def open_array(
12961280
raise ArrayNotFoundError(msg) from err
12971281

12981282

1299-
async def open_like(
1300-
a: ArrayLike, path: str, **kwargs: Any
1301-
) -> AsyncArray[ArrayV3Metadata] | AsyncArray[ArrayV2Metadata]:
1283+
async def open_like(a: ArrayLike, path: str, **kwargs: Any) -> AnyAsyncArray:
13021284
"""Open a persistent array like `a`.
13031285
13041286
Parameters
@@ -1321,9 +1303,7 @@ async def open_like(
13211303
return await open_array(path=path, **like_kwargs) # type: ignore[arg-type]
13221304

13231305

1324-
async def zeros(
1325-
shape: tuple[int, ...], **kwargs: Any
1326-
) -> AsyncArray[ArrayV2Metadata] | AsyncArray[ArrayV3Metadata]:
1306+
async def zeros(shape: tuple[int, ...], **kwargs: Any) -> AnyAsyncArray:
13271307
"""Create an array, with zero being used as the default value for
13281308
uninitialized portions of the array.
13291309
@@ -1342,9 +1322,7 @@ async def zeros(
13421322
return await create(shape=shape, fill_value=0, **kwargs)
13431323

13441324

1345-
async def zeros_like(
1346-
a: ArrayLike, **kwargs: Any
1347-
) -> AsyncArray[ArrayV2Metadata] | AsyncArray[ArrayV3Metadata]:
1325+
async def zeros_like(a: ArrayLike, **kwargs: Any) -> AnyAsyncArray:
13481326
"""Create an array of zeros like `a`.
13491327
13501328
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"
@@ -639,7 +639,7 @@ async def _create(
639639
overwrite: bool = False,
640640
data: npt.ArrayLike | None = None,
641641
config: ArrayConfigLike | None = None,
642-
) -> AsyncArray[ArrayV2Metadata] | AsyncArray[ArrayV3Metadata]:
642+
) -> AnyAsyncArray:
643643
"""Method to create a new asynchronous array instance.
644644
Deprecated in favor of [`zarr.api.asynchronous.create_array`][].
645645
"""
@@ -660,7 +660,7 @@ async def _create(
660660
_chunks = normalize_chunks(chunk_shape, shape, item_size)
661661
config_parsed = parse_array_config(config)
662662

663-
result: AsyncArray[ArrayV3Metadata] | AsyncArray[ArrayV2Metadata]
663+
result: AnyAsyncArray
664664
if zarr_format == 3:
665665
if dimension_separator is not None:
666666
raise ValueError(
@@ -929,7 +929,7 @@ def from_dict(
929929
cls,
930930
store_path: StorePath,
931931
data: dict[str, JSON],
932-
) -> AsyncArray[ArrayV3Metadata] | AsyncArray[ArrayV2Metadata]:
932+
) -> AnyAsyncArray:
933933
"""
934934
Create a Zarr array from a dictionary, with support for both Zarr format 2 and 3 metadata.
935935
@@ -961,7 +961,7 @@ async def open(
961961
cls,
962962
store: StoreLike,
963963
zarr_format: ZarrFormat | None = 3,
964-
) -> AsyncArray[ArrayV3Metadata] | AsyncArray[ArrayV2Metadata]:
964+
) -> AnyAsyncArray:
965965
"""
966966
Async method to open an existing Zarr array from a given store.
967967
@@ -4162,7 +4162,7 @@ def info_complete(self) -> Any:
41624162

41634163

41644164
async def _shards_initialized(
4165-
array: AsyncArray[ArrayV2Metadata] | AsyncArray[ArrayV3Metadata],
4165+
array: AnyAsyncArray,
41664166
) -> tuple[str, ...]:
41674167
"""
41684168
Return the keys of the chunks that have been persisted to the storage backend.
@@ -4243,7 +4243,7 @@ async def from_array(
42434243
storage_options: dict[str, Any] | None = None,
42444244
overwrite: bool = False,
42454245
config: ArrayConfigLike | None = None,
4246-
) -> AsyncArray[ArrayV2Metadata] | AsyncArray[ArrayV3Metadata]:
4246+
) -> AnyAsyncArray:
42474247
"""Create an array from an existing array or array-like.
42484248
42494249
Parameters
@@ -4509,7 +4509,7 @@ async def init_array(
45094509
dimension_names: DimensionNames = None,
45104510
overwrite: bool = False,
45114511
config: ArrayConfigLike | None = None,
4512-
) -> AsyncArray[ArrayV3Metadata] | AsyncArray[ArrayV2Metadata]:
4512+
) -> AnyAsyncArray:
45134513
"""Create and persist an array metadata document.
45144514
45154515
Parameters
@@ -4727,7 +4727,7 @@ async def create_array(
47274727
overwrite: bool = False,
47284728
config: ArrayConfigLike | None = None,
47294729
write_data: bool = True,
4730-
) -> AsyncArray[ArrayV2Metadata] | AsyncArray[ArrayV3Metadata]:
4730+
) -> AnyAsyncArray:
47314731
"""Create an array.
47324732
47334733
Parameters
@@ -5273,7 +5273,7 @@ def _parse_data_params(
52735273

52745274

52755275
def _iter_chunk_coords(
5276-
array: AnyArray | AsyncArray[Any],
5276+
array: AnyArray | AnyAsyncArray,
52775277
*,
52785278
origin: Sequence[int] | None = None,
52795279
selection_shape: Sequence[int] | None = None,
@@ -5304,7 +5304,7 @@ def _iter_chunk_coords(
53045304

53055305

53065306
def _iter_shard_coords(
5307-
array: AnyArray | AsyncArray[Any],
5307+
array: AnyArray | AnyAsyncArray,
53085308
*,
53095309
origin: Sequence[int] | None = None,
53105310
selection_shape: Sequence[int] | None = None,
@@ -5335,7 +5335,7 @@ def _iter_shard_coords(
53355335

53365336

53375337
def _iter_shard_keys(
5338-
array: AnyArray | AsyncArray[Any],
5338+
array: AnyArray | AnyAsyncArray,
53395339
*,
53405340
origin: Sequence[int] | None = None,
53415341
selection_shape: Sequence[int] | None = None,
@@ -5364,7 +5364,7 @@ def _iter_shard_keys(
53645364

53655365

53665366
def _iter_shard_regions(
5367-
array: AnyArray | AsyncArray[Any],
5367+
array: AnyArray | AnyAsyncArray,
53685368
*,
53695369
origin: Sequence[int] | None = None,
53705370
selection_shape: Sequence[int] | None = None,
@@ -5399,7 +5399,7 @@ def _iter_shard_regions(
53995399

54005400

54015401
def _iter_chunk_regions(
5402-
array: AnyArray | AsyncArray[Any],
5402+
array: AnyArray | AnyAsyncArray,
54035403
*,
54045404
origin: Sequence[int] | None = None,
54055405
selection_shape: Sequence[int] | None = None,

0 commit comments

Comments
 (0)