Skip to content

Commit bc938bd

Browse files
authored
fix(attrs): update array attrs in place (#2329)
* fix(attrs): update array attrs in place * improve test
1 parent cef4552 commit bc938bd

File tree

3 files changed

+27
-3
lines changed

3 files changed

+27
-3
lines changed

src/zarr/core/array.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -896,11 +896,14 @@ async def _delete_key(key: str) -> None:
896896
return replace(self, metadata=new_metadata)
897897

898898
async def update_attributes(self, new_attributes: dict[str, JSON]) -> Self:
899-
new_metadata = self.metadata.update_attributes(new_attributes)
899+
# metadata.attributes is "frozen" so we simply clear and update the dict
900+
self.metadata.attributes.clear()
901+
self.metadata.attributes.update(new_attributes)
900902

901903
# Write new metadata
902-
await self._save_metadata(new_metadata)
903-
return replace(self, metadata=new_metadata)
904+
await self._save_metadata(self.metadata)
905+
906+
return self
904907

905908
def __repr__(self) -> str:
906909
return f"<AsyncArray {self.store_path} shape={self.shape} dtype={self.dtype}>"

tests/v3/test_array.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -406,3 +406,15 @@ def test_vlen_errors() -> None:
406406
dtype="<U4",
407407
codecs=[BytesCodec(), VLenBytesCodec()],
408408
)
409+
410+
411+
@pytest.mark.parametrize("zarr_format", [2, 3])
412+
def test_update_attrs(zarr_format: int) -> None:
413+
# regression test for https://github.com/zarr-developers/zarr-python/issues/2328
414+
store = MemoryStore({}, mode="w")
415+
arr = Array.create(store=store, shape=5, chunk_shape=5, dtype="f8", zarr_format=zarr_format)
416+
arr.attrs["foo"] = "bar"
417+
assert arr.attrs["foo"] == "bar"
418+
419+
arr2 = zarr.open_array(store=store, zarr_format=zarr_format)
420+
assert arr2.attrs["foo"] == "bar"

tests/v3/test_group.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1257,3 +1257,12 @@ def test_from_dict_extra_fields(self):
12571257
result = GroupMetadata.from_dict(data)
12581258
expected = GroupMetadata(attributes={"key": "value"}, zarr_format=2)
12591259
assert result == expected
1260+
1261+
1262+
def test_update_attrs() -> None:
1263+
# regression test for https://github.com/zarr-developers/zarr-python/issues/2328
1264+
root = Group.from_store(
1265+
MemoryStore({}, mode="w"),
1266+
)
1267+
root.attrs["foo"] = "bar"
1268+
assert root.attrs["foo"] == "bar"

0 commit comments

Comments
 (0)