55from dataclasses import dataclass , field , replace
66from itertools import starmap
77from logging import getLogger
8- from typing import TYPE_CHECKING , Any , Generic , Literal , cast , overload
8+ from typing import TYPE_CHECKING , Any , Generic , Literal , TypedDict , cast , overload
99
1010import numpy as np
1111import numpy .typing as npt
4141 parse_shapelike ,
4242 product ,
4343)
44- from zarr .core .config import config , parse_indexing_order
44+ from zarr .core .config import config as base_config
45+ from zarr .core .config import parse_indexing_order
4546from zarr .core .indexing import (
4647 BasicIndexer ,
4748 BasicSelection ,
9697logger = getLogger (__name__ )
9798
9899
100+ @dataclass (frozen = True , slots = True , kw_only = True )
101+ class ArrayConfig :
102+ write_empty_chunks : bool
103+
104+
105+ class ArrayConfigDict (TypedDict ):
106+ write_empty_chunks : bool
107+
108+
99109def parse_array_metadata (data : Any ) -> ArrayMetadata :
100110 if isinstance (data , ArrayMetadata ):
101111 return data
@@ -205,13 +215,15 @@ class AsyncArray(Generic[T_ArrayMetadata]):
205215 store_path : StorePath
206216 codec_pipeline : CodecPipeline = field (init = False )
207217 order : MemoryOrder
218+ config : ArrayConfig
208219
209220 @overload
210221 def __init__ (
211222 self : AsyncArray [ArrayV2Metadata ],
212223 metadata : ArrayV2Metadata | ArrayV2MetadataDict ,
213224 store_path : StorePath ,
214225 order : MemoryOrder | None = None ,
226+ config : ArrayConfig | ArrayConfigDict | None = None ,
215227 ) -> None : ...
216228
217229 @overload
@@ -220,13 +232,15 @@ def __init__(
220232 metadata : ArrayV3Metadata | ArrayV3MetadataDict ,
221233 store_path : StorePath ,
222234 order : MemoryOrder | None = None ,
235+ config : ArrayConfig | ArrayConfigDict | None = None ,
223236 ) -> None : ...
224237
225238 def __init__ (
226239 self ,
227240 metadata : ArrayMetadata | ArrayMetadataDict ,
228241 store_path : StorePath ,
229242 order : MemoryOrder | None = None ,
243+ config : ArrayConfig | ArrayConfigDict | None = None ,
230244 ) -> None :
231245 if isinstance (metadata , dict ):
232246 zarr_format = metadata ["zarr_format" ]
@@ -240,7 +254,7 @@ def __init__(
240254 raise ValueError (f"Invalid zarr_format: { zarr_format } . Expected 2 or 3" )
241255
242256 metadata_parsed = parse_array_metadata (metadata )
243- order_parsed = parse_indexing_order (order or config .get ("array.order" ))
257+ order_parsed = parse_indexing_order (order or base_config .get ("array.order" ))
244258
245259 object .__setattr__ (self , "metadata" , metadata_parsed )
246260 object .__setattr__ (self , "store_path" , store_path )
@@ -610,7 +624,7 @@ async def _create_v2(
610624 await ensure_no_existing_node (store_path , zarr_format = 2 )
611625
612626 if order is None :
613- order = parse_indexing_order (config .get ("array.order" ))
627+ order = parse_indexing_order (base_config .get ("array.order" ))
614628
615629 if dimension_separator is None :
616630 dimension_separator = "."
@@ -1123,7 +1137,7 @@ async def _delete_key(key: str) -> None:
11231137 for chunk_coords in old_chunk_coords .difference (new_chunk_coords )
11241138 ],
11251139 _delete_key ,
1126- config .get ("async.concurrency" ),
1140+ base_config .get ("async.concurrency" ),
11271141 )
11281142
11291143 # Write new metadata
0 commit comments