Skip to content

Stores are no longer MutableMappings #2023

Closed
@ghidalgo3

Description

@ghidalgo3

Zarr version

3.0.0a0

Numcodecs version

0.12.1

Python Version

3.10.12

Operating System

Linux

Installation

pip install zarr==3.0.0a0

Description

This is a downstream issue for Kerchunk.

In ZarrV2, BaseStore inherited from MutableMapping which brought with it the ability to copy() and call items() on a BaseStore, which Kerchunk depended on here.

In ZarrV3, neither StorePath nor Store are copy()-able, and of course __iter__, __setitem__, and __getitem__ are not available to make it anything like a MutableMapping.

@martindurant do you think this is something Kerchunk should handle or should ZarrV3 preserve the behavior of stores?

Steps to reproduce

This is the definition of the function Kerchunk is calling:

from zarr.store.core import MemoryStore, StorePath

def _encode_for_JSON(store):
    """Make store JSON encodable"""
    for k, v in store.copy().items():
        if isinstance(v, list):
            continue
        else:
            try:
                # minify JSON
                v = ujson.dumps(ujson.loads(v))
            except (ValueError, TypeError):
                pass
            try:
                store[k] = v.decode() if isinstance(v, bytes) else v
            except UnicodeDecodeError:
                store[k] = "base64:" + base64.b64encode(v).decode()
    return store

_encode_for_JSON(StorePath(MemoryStore(mode="w"))) # Will throw

Additional output

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugPotential issues with the zarr-python library

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions