@@ -700,6 +700,10 @@ async def _members(
700700 "Object at %s is not recognized as a component of a Zarr hierarchy." , key
701701 )
702702
703+ async def keys (self ) -> AsyncGenerator [str , None ]:
704+ async for key , _ in self .members ():
705+ yield key
706+
703707 async def contains (self , member : str ) -> bool :
704708 # TODO: this can be made more efficient.
705709 try :
@@ -823,10 +827,10 @@ def __delitem__(self, key: str) -> None:
823827 self ._sync (self ._async_group .delitem (key ))
824828
825829 def __iter__ (self ) -> Iterator [str ]:
826- raise NotImplementedError
830+ yield from self . keys ()
827831
828832 def __len__ (self ) -> int :
829- raise NotImplementedError
833+ return self . nmembers ()
830834
831835 def __setitem__ (self , key : str , value : Any ) -> None :
832836 """__setitem__ is not supported in v3"""
@@ -906,6 +910,9 @@ def members(self, max_depth: int | None = 0) -> tuple[tuple[str, Array | Group],
906910
907911 return tuple ((kv [0 ], _parse_async_node (kv [1 ])) for kv in _members )
908912
913+ def keys (self ) -> Generator [str , None ]:
914+ yield from self ._sync_iter (self ._async_group .keys ())
915+
909916 def __contains__ (self , member : str ) -> bool :
910917 return self ._sync (self ._async_group .contains (member ))
911918
0 commit comments