From aa3a5479ef931dcf66168903c65176d42d5422fd Mon Sep 17 00:00:00 2001 From: Zentrik Date: Thu, 23 Jul 2026 07:10:01 +0100 Subject: [PATCH 1/4] `SChunk.meta.get`: Fix infinite recursion Fixes https://github.com/Blosc/python-blosc2/issues/679 --- src/blosc2/schunk.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/blosc2/schunk.py b/src/blosc2/schunk.py index b8d6fa879..e6cafbec8 100644 --- a/src/blosc2/schunk.py +++ b/src/blosc2/schunk.py @@ -154,7 +154,7 @@ class Meta(Mapping): def get(self, key: str, default: Any = None) -> Any: """Return the value for `key` if `key` is in the dictionary, else return `default`. If `default` is not given, it defaults to ``None``.""" - return self.get(key, default) + return self[key] if key in self else default def __init__(self, schunk): self.schunk = schunk From f37f841cd2144eedc2a530fd3dfc8d7c743ed287 Mon Sep 17 00:00:00 2001 From: Zentrik Date: Fri, 24 Jul 2026 08:58:05 +0100 Subject: [PATCH 2/4] Avoid duplicate contains check Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/blosc2/schunk.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/blosc2/schunk.py b/src/blosc2/schunk.py index e6cafbec8..4184e1432 100644 --- a/src/blosc2/schunk.py +++ b/src/blosc2/schunk.py @@ -154,7 +154,10 @@ class Meta(Mapping): def get(self, key: str, default: Any = None) -> Any: """Return the value for `key` if `key` is in the dictionary, else return `default`. If `default` is not given, it defaults to ``None``.""" - return self[key] if key in self else default + try: + return self[key] + except KeyError: + return default def __init__(self, schunk): self.schunk = schunk From 382dbb5831a1a41d3654a8bb8ccb85dfde819064 Mon Sep 17 00:00:00 2001 From: Zentrik Date: Sat, 25 Jul 2026 11:14:05 +0100 Subject: [PATCH 3/4] Add regression test for `SChunk.meta.get` Covers both the recursion fix and `Mapping.get` semantics: the stored value for a present key, and the default for a missing one. Co-Authored-By: Claude Opus 5 --- tests/ndarray/test_metalayers.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/ndarray/test_metalayers.py b/tests/ndarray/test_metalayers.py index 8da9399a5..ca0dbcdd2 100644 --- a/tests/ndarray/test_metalayers.py +++ b/tests/ndarray/test_metalayers.py @@ -52,6 +52,11 @@ def test_metalayers(shape, chunks, blocks, urlpath, contiguous, dtype): assert "test" in a.schunk.meta assert a.schunk.meta["test"] == test_meta + # `get` should behave like `Mapping.get` (see #679) + assert a.schunk.meta.get("numpy") == numpy_meta + assert a.schunk.meta.get("error") is None + assert a.schunk.meta.get("error", "default") == "default" + test_meta = {b"lorem": 4231} a.schunk.meta["test"] = test_meta assert a.schunk.meta["test"] == test_meta From 968e4d1b6f1493898c9412bd5ccb60fc7c98d497 Mon Sep 17 00:00:00 2001 From: Zentrik Date: Sat, 25 Jul 2026 11:25:00 +0100 Subject: [PATCH 4/4] Drop redundant comment in metalayer test Co-Authored-By: Claude Opus 5 --- tests/ndarray/test_metalayers.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/ndarray/test_metalayers.py b/tests/ndarray/test_metalayers.py index ca0dbcdd2..36f5b4ddb 100644 --- a/tests/ndarray/test_metalayers.py +++ b/tests/ndarray/test_metalayers.py @@ -52,7 +52,6 @@ def test_metalayers(shape, chunks, blocks, urlpath, contiguous, dtype): assert "test" in a.schunk.meta assert a.schunk.meta["test"] == test_meta - # `get` should behave like `Mapping.get` (see #679) assert a.schunk.meta.get("numpy") == numpy_meta assert a.schunk.meta.get("error") is None assert a.schunk.meta.get("error", "default") == "default"