5555
5656
5757def parse_zarr_format (data : Any ) -> ZarrFormat :
58+ """Parse the zarr_format field from metadata."""
5859 if data in (2 , 3 ):
5960 return cast (Literal [2 , 3 ], data )
6061 msg = f"Invalid zarr_format. Expected one of 2 or 3. Got { data } ."
6162 raise ValueError (msg )
6263
6364
6465def parse_node_type (data : Any ) -> NodeType :
66+ """Parse the node_type field from metadata."""
6567 if data in ("array" , "group" ):
6668 return cast (Literal ["array" , "group" ], data )
6769 raise MetadataValidationError ("node_type" , "array or group" , data )
6870
6971
7072# todo: convert None to empty dict
7173def parse_attributes (data : Any ) -> dict [str , Any ]:
74+ """Parse the attributes field from metadata."""
7275 if data is None :
7376 return {}
7477 elif isinstance (data , dict ) and all (isinstance (k , str ) for k in data ):
@@ -88,9 +91,7 @@ def _parse_async_node(node: AsyncGroup) -> Group: ...
8891def _parse_async_node (
8992 node : AsyncArray [ArrayV2Metadata ] | AsyncArray [ArrayV3Metadata ] | AsyncGroup ,
9093) -> Array | Group :
91- """
92- Wrap an AsyncArray in an Array, or an AsyncGroup in a Group.
93- """
94+ """Wrap an AsyncArray in an Array, or an AsyncGroup in a Group."""
9495 if isinstance (node , AsyncArray ):
9596 return Array (node )
9697 elif isinstance (node , AsyncGroup ):
@@ -297,6 +298,10 @@ def flatten(
297298
298299@dataclass (frozen = True )
299300class GroupMetadata (Metadata ):
301+ """
302+ Metadata for a Group.
303+ """
304+
300305 attributes : dict [str , Any ] = field (default_factory = dict )
301306 zarr_format : ZarrFormat = 3
302307 consolidated_metadata : ConsolidatedMetadata | None = None
@@ -391,6 +396,10 @@ def to_dict(self) -> dict[str, Any]:
391396
392397@dataclass (frozen = True )
393398class AsyncGroup :
399+ """
400+ Asynchronous Group object.
401+ """
402+
394403 metadata : GroupMetadata
395404 store_path : StorePath
396405
@@ -620,6 +629,18 @@ async def getitem(
620629 self ,
621630 key : str ,
622631 ) -> AsyncArray [ArrayV2Metadata ] | AsyncArray [ArrayV3Metadata ] | AsyncGroup :
632+ """
633+ Get a subarray or subgroup from the group.
634+
635+ Parameters
636+ ----------
637+ key : str
638+ Array or group name
639+
640+ Returns
641+ -------
642+ AsyncArray or AsyncGroup
643+ """
623644 store_path = self .store_path / key
624645 logger .debug ("key=%s, store_path=%s" , key , store_path )
625646
@@ -725,6 +746,13 @@ def _getitem_consolidated(
725746 return AsyncArray (metadata = metadata , store_path = store_path )
726747
727748 async def delitem (self , key : str ) -> None :
749+ """Delete a group member.
750+
751+ Parameters
752+ ----------
753+ key : str
754+ Array or group name
755+ """
728756 store_path = self .store_path / key
729757 if self .metadata .zarr_format == 3 :
730758 await (store_path / ZARR_JSON ).delete ()
@@ -834,6 +862,21 @@ async def create_group(
834862 exists_ok : bool = False ,
835863 attributes : dict [str , Any ] | None = None ,
836864 ) -> AsyncGroup :
865+ """Create a sub-group.
866+
867+ Parameters
868+ ----------
869+ name : str
870+ Group name.
871+ exists_ok : bool, optional
872+ If True, do not raise an error if the group already exists.
873+ attributes : dict, optional
874+ Group attributes.
875+
876+ Returns
877+ -------
878+ g : AsyncGroup
879+ """
837880 attributes = attributes or {}
838881 return await type (self ).from_store (
839882 self .store_path / name ,
@@ -875,7 +918,17 @@ async def require_group(self, name: str, overwrite: bool = False) -> AsyncGroup:
875918 return grp
876919
877920 async def require_groups (self , * names : str ) -> tuple [AsyncGroup , ...]:
878- """Convenience method to require multiple groups in a single call."""
921+ """Convenience method to require multiple groups in a single call.
922+
923+ Parameters
924+ ----------
925+ *names : str
926+ Group names.
927+
928+ Returns
929+ -------
930+ Tuple[AsyncGroup, ...]
931+ """
879932 if not names :
880933 return ()
881934 return tuple (await asyncio .gather (* (self .require_group (name ) for name in names )))
@@ -1083,6 +1136,17 @@ async def require_array(
10831136 return ds
10841137
10851138 async def update_attributes (self , new_attributes : dict [str , Any ]) -> AsyncGroup :
1139+ """Update group attributes.
1140+
1141+ Parameters
1142+ ----------
1143+ new_attributes : dict
1144+ New attributes to set on the group.
1145+
1146+ Returns
1147+ -------
1148+ self : AsyncGroup
1149+ """
10861150 # metadata.attributes is "frozen" so we simply clear and update the dict
10871151 self .metadata .attributes .clear ()
10881152 self .metadata .attributes .update (new_attributes )
@@ -1241,10 +1305,22 @@ def _members_consolidated(
12411305 yield from obj ._members_consolidated (max_depth , current_depth + 1 , prefix = key )
12421306
12431307 async def keys (self ) -> AsyncGenerator [str , None ]:
1308+ """Iterate over member names."""
12441309 async for key , _ in self .members ():
12451310 yield key
12461311
12471312 async def contains (self , member : str ) -> bool :
1313+ """Check if a member exists in the group.
1314+
1315+ Parameters
1316+ ----------
1317+ member : str
1318+ Member name.
1319+
1320+ Returns
1321+ -------
1322+ bool
1323+ """
12481324 # TODO: this can be made more efficient.
12491325 try :
12501326 await self .getitem (member )
@@ -1254,15 +1330,18 @@ async def contains(self, member: str) -> bool:
12541330 return True
12551331
12561332 async def groups (self ) -> AsyncGenerator [tuple [str , AsyncGroup ], None ]:
1333+ """Iterate over subgroups."""
12571334 async for name , value in self .members ():
12581335 if isinstance (value , AsyncGroup ):
12591336 yield name , value
12601337
12611338 async def group_keys (self ) -> AsyncGenerator [str , None ]:
1339+ """Iterate over group names."""
12621340 async for key , _ in self .groups ():
12631341 yield key
12641342
12651343 async def group_values (self ) -> AsyncGenerator [AsyncGroup , None ]:
1344+ """Iterate over group values."""
12661345 async for _ , group in self .groups ():
12671346 yield group
12681347
@@ -1271,21 +1350,25 @@ async def arrays(
12711350 ) -> AsyncGenerator [
12721351 tuple [str , AsyncArray [ArrayV2Metadata ] | AsyncArray [ArrayV3Metadata ]], None
12731352 ]:
1353+ """Iterate over arrays."""
12741354 async for key , value in self .members ():
12751355 if isinstance (value , AsyncArray ):
12761356 yield key , value
12771357
12781358 async def array_keys (self ) -> AsyncGenerator [str , None ]:
1359+ """Iterate over array names."""
12791360 async for key , _ in self .arrays ():
12801361 yield key
12811362
12821363 async def array_values (
12831364 self ,
12841365 ) -> AsyncGenerator [AsyncArray [ArrayV2Metadata ] | AsyncArray [ArrayV3Metadata ], None ]:
1366+ """Iterate over array values."""
12851367 async for _ , array in self .arrays ():
12861368 yield array
12871369
12881370 async def tree (self , expand : bool = False , level : int | None = None ) -> Any :
1371+ """Return a nested representation of the group hierarchy."""
12891372 raise NotImplementedError
12901373
12911374 async def empty (
@@ -1467,7 +1550,12 @@ async def full_like(
14671550 return await async_api .full_like (a = data , store = self .store_path , path = name , ** kwargs )
14681551
14691552 async def move (self , source : str , dest : str ) -> None :
1470- """Not implemented"""
1553+ """Move a sub-group or sub-array from one path to another.
1554+
1555+ Notes
1556+ -----
1557+ Not implemented
1558+ """
14711559 raise NotImplementedError
14721560
14731561
@@ -1609,7 +1697,22 @@ def get(self, path: str, default: DefaultT | None = None) -> Array | Group | Def
16091697 return default
16101698
16111699 def __delitem__ (self , key : str ) -> None :
1612- """Delete a group member."""
1700+ """Delete a group member.
1701+
1702+ Parameters
1703+ ----------
1704+ key : str
1705+ Group member name.
1706+
1707+ Examples
1708+ --------
1709+ >>> import zarr
1710+ >>> group = Group.from_store(zarr.storage.MemoryStore(mode="w"))
1711+ >>> group.create_array(name="subarray", shape=(10,), chunk_shape=(10,))
1712+ >>> del group["subarray"]
1713+ >>> "subarray" in group
1714+ False
1715+ """
16131716 self ._sync (self ._async_group .delitem (key ))
16141717
16151718 def __iter__ (self ) -> Iterator [str ]:
@@ -1639,6 +1742,22 @@ def __setitem__(self, key: str, value: Any) -> None:
16391742 """Fastpath for creating a new array.
16401743
16411744 New arrays will be created using default settings for the array type.
1745+ If you need to create an array with custom settings, use the `create_array` method.
1746+
1747+ Parameters
1748+ ----------
1749+ key : str
1750+ Array name.
1751+ value : Any
1752+ Array data.
1753+
1754+ Examples
1755+ --------
1756+ >>> import zarr
1757+ >>> group = zarr.group()
1758+ >>> group["foo"] = zarr.zeros((10,))
1759+ >>> group["foo"]
1760+ <Array memory://132270269438272/foo shape=(10,) dtype=float64>
16421761 """
16431762 self ._sync (self ._async_group .setitem (key , value ))
16441763
@@ -1647,6 +1766,7 @@ def __repr__(self) -> str:
16471766
16481767 async def update_attributes_async (self , new_attributes : dict [str , Any ]) -> Group :
16491768 """Update the attributes of this group.
1769+
16501770 Example
16511771 -------
16521772 >>> import zarr
@@ -1697,6 +1817,7 @@ def attrs(self) -> Attributes:
16971817
16981818 @property
16991819 def info (self ) -> None :
1820+ """Group information."""
17001821 raise NotImplementedError
17011822
17021823 @property
@@ -1757,6 +1878,7 @@ def members(self, max_depth: int | None = 0) -> tuple[tuple[str, Array | Group],
17571878
17581879 def keys (self ) -> Generator [str , None ]:
17591880 """Return an iterator over group member names.
1881+
17601882 Examples
17611883 --------
17621884 >>> import zarr
@@ -1795,6 +1917,7 @@ def __contains__(self, member: str) -> bool:
17951917
17961918 def groups (self ) -> Generator [tuple [str , Group ], None ]:
17971919 """Return the sub-groups of this group as a generator of (name, group) pairs.
1920+
17981921 Example
17991922 -------
18001923 >>> import zarr
@@ -1809,6 +1932,7 @@ def groups(self) -> Generator[tuple[str, Group], None]:
18091932
18101933 def group_keys (self ) -> Generator [str , None ]:
18111934 """Return an iterator over group member names.
1935+
18121936 Examples
18131937 --------
18141938 >>> import zarr
@@ -1823,6 +1947,7 @@ def group_keys(self) -> Generator[str, None]:
18231947
18241948 def group_values (self ) -> Generator [Group , None ]:
18251949 """Return an iterator over group members.
1950+
18261951 Examples
18271952 --------
18281953 >>> import zarr
@@ -1836,8 +1961,8 @@ def group_values(self) -> Generator[Group, None]:
18361961 yield group
18371962
18381963 def arrays (self ) -> Generator [tuple [str , Array ], None ]:
1839- """
1840- Return the sub-arrays of this group as a generator of (name, array) pairs
1964+ """Return the sub-arrays of this group as a generator of (name, array) pairs
1965+
18411966 Examples
18421967 --------
18431968 >>> import zarr
@@ -1852,6 +1977,7 @@ def arrays(self) -> Generator[tuple[str, Array], None]:
18521977
18531978 def array_keys (self ) -> Generator [str , None ]:
18541979 """Return an iterator over group member names.
1980+
18551981 Examples
18561982 --------
18571983 >>> import zarr
@@ -1867,6 +1993,7 @@ def array_keys(self) -> Generator[str, None]:
18671993
18681994 def array_values (self ) -> Generator [Array , None ]:
18691995 """Return an iterator over group members.
1996+
18701997 Examples
18711998 --------
18721999 >>> import zarr
@@ -1880,7 +2007,12 @@ def array_values(self) -> Generator[Array, None]:
18802007 yield array
18812008
18822009 def tree (self , expand : bool = False , level : int | None = None ) -> Any :
1883- """Not implemented"""
2010+ """Return a nested representation of the group hierarchy.
2011+
2012+ Notes
2013+ -----
2014+ Not implemented
2015+ """
18842016 return self ._sync (self ._async_group .tree (expand = expand , level = level ))
18852017
18862018 def create_group (self , name : str , ** kwargs : Any ) -> Group :
@@ -1920,7 +2052,17 @@ def require_group(self, name: str, **kwargs: Any) -> Group:
19202052 return Group (self ._sync (self ._async_group .require_group (name , ** kwargs )))
19212053
19222054 def require_groups (self , * names : str ) -> tuple [Group , ...]:
1923- """Convenience method to require multiple groups in a single call."""
2055+ """Convenience method to require multiple groups in a single call.
2056+
2057+ Parameters
2058+ ----------
2059+ *names : str
2060+ Group names.
2061+
2062+ Returns
2063+ -------
2064+ groups : tuple of Groups
2065+ """
19242066 return tuple (map (Group , self ._sync (self ._async_group .require_groups (* names ))))
19252067
19262068 def create (self , * args : Any , ** kwargs : Any ) -> Array :
@@ -2259,7 +2401,12 @@ def full_like(self, *, name: str, data: async_api.ArrayLike, **kwargs: Any) -> A
22592401 return Array (self ._sync (self ._async_group .full_like (name = name , data = data , ** kwargs )))
22602402
22612403 def move (self , source : str , dest : str ) -> None :
2262- """Not implemented"""
2404+ """Move a sub-group or sub-array from one path to another.
2405+
2406+ Notes
2407+ -----
2408+ Not implemented
2409+ """
22632410 return self ._sync (self ._async_group .move (source , dest ))
22642411
22652412 @deprecated ("Use Group.create_array instead." )
0 commit comments