Skip to content

perf: "two-pass" seurat hvg via scanpy.get.aggregate#4013

Draft
ilan-gold wants to merge 20 commits into
mainfrom
ig/two_pass_hvg_v3
Draft

perf: "two-pass" seurat hvg via scanpy.get.aggregate#4013
ilan-gold wants to merge 20 commits into
mainfrom
ig/two_pass_hvg_v3

Conversation

@ilan-gold
Copy link
Copy Markdown
Contributor

An idea that popped into my head for disk-bound datasets but likely also normal ones. This should, in theory, greatly improve on-disk access and produce speed ups for disk bound data by reducing the amount of i/o in the worst case, unordered scenario (while, I would guess, leaving in-memory datasets untocuhed or maybe improved thanks to memory access + more efficient mean/var).

  • Closes #
  • Tests included or not required because:

@ilan-gold ilan-gold added this to the 1.12.1 milestone Mar 26, 2026
@ilan-gold ilan-gold changed the title perf: "two-pass" seurat hvg3 via scanpy.get.aggregate perf: "two-pass" seurat hvg via scanpy.get.aggregate Mar 26, 2026
@codecov
Copy link
Copy Markdown

codecov Bot commented Mar 26, 2026

❌ 5 Tests Failed:

Tests completed Failed Passed Skipped
1852 5 1847 925
View the top 3 failed test(s) by shortest run time
tests/test_readwrite.py::test_write_strings_to_cats[no_s2c-zarr]
Stack Traces | 0.007s run time
fmt = 'zarr'

    #x1B[0m#x1B[37m@pytest#x1B[39;49;00m.mark.skipif(#x1B[90m#x1B[39;49;00m
        pkg_version(#x1B[33m"#x1B[39;49;00m#x1B[33manndata#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m) < Version(#x1B[33m"#x1B[39;49;00m#x1B[33m0.11.0rc2#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m),#x1B[90m#x1B[39;49;00m
        reason=#x1B[33m"#x1B[39;49;00m#x1B[33mOlder AnnData has no convert_strings_to_categoricals#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
    )#x1B[90m#x1B[39;49;00m
    #x1B[37m@pytest#x1B[39;49;00m.mark.parametrize(#x1B[33m"#x1B[39;49;00m#x1B[33mfmt#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, [#x1B[33m"#x1B[39;49;00m#x1B[33mh5ad#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, pytest.param(#x1B[33m"#x1B[39;49;00m#x1B[33mzarr#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, marks=needs.zarr)])#x1B[90m#x1B[39;49;00m
    #x1B[37m@pytest#x1B[39;49;00m.mark.parametrize(#x1B[33m"#x1B[39;49;00m#x1B[33ms2c#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, [#x1B[94mTrue#x1B[39;49;00m, #x1B[94mFalse#x1B[39;49;00m], ids=[#x1B[33m"#x1B[39;49;00m#x1B[33ms2c#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[33m"#x1B[39;49;00m#x1B[33mno_s2c#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m])#x1B[90m#x1B[39;49;00m
    #x1B[94mdef#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[92mtest_write_strings_to_cats#x1B[39;49;00m(fmt: Literal[#x1B[33m"#x1B[39;49;00m#x1B[33mh5ad#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[33m"#x1B[39;49;00m#x1B[33mzarr#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m], *, s2c: #x1B[96mbool#x1B[39;49;00m) -> #x1B[94mNone#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
        adata = AnnData(np.array([[#x1B[94m1#x1B[39;49;00m, #x1B[94m2#x1B[39;49;00m], [#x1B[94m3#x1B[39;49;00m, #x1B[94m4#x1B[39;49;00m], [#x1B[94m5#x1B[39;49;00m, #x1B[94m6#x1B[39;49;00m]]), obs=#x1B[96mdict#x1B[39;49;00m(a=[#x1B[33m"#x1B[39;49;00m#x1B[33ma#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[33m"#x1B[39;49;00m#x1B[33mb#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[33m"#x1B[39;49;00m#x1B[33ma#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m]))#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
>       sc.write(#x1B[33m"#x1B[39;49;00m#x1B[33mtest#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, adata, convert_strings_to_categoricals=s2c, ext=fmt)#x1B[90m#x1B[39;49;00m

#x1B[1m#x1B[31mtests/test_readwrite.py#x1B[0m:110: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
#x1B[1m#x1B[31msrc/scanpy/readwrite.py#x1B[0m:746: in write
    #x1B[0mwrite_zarr(filename, adata, **extra_kw)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/_io/utils.py#x1B[0m:349: in raise_error_if_dataset_2d_present
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m write(store, adata, *args, **kwargs)#x1B[90m#x1B[39;49;00m
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/_io/zarr.py#x1B[0m:59: in write_zarr
    #x1B[0mwrite_dispatched(f, #x1B[33m"#x1B[39;49;00m#x1B[33m/#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, adata, callback=callback, dataset_kwargs=ds_kwargs)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/experimental/_dispatch_io.py#x1B[0m:74: in write_dispatched
    #x1B[0mwriter.write_elem(store, key, elem, dataset_kwargs=dataset_kwargs)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/_io/utils.py#x1B[0m:272: in func_wrapper
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m func(*args, **kwargs)#x1B[90m#x1B[39;49;00m
           ^^^^^^^^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/registry.py#x1B[0m:391: in write_elem
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m.callback(#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/_io/zarr.py#x1B[0m:57: in callback
    #x1B[0mwrite_func(store, elem_name, elem, dataset_kwargs=dataset_kwargs)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/registry.py#x1B[0m:78: in wrapper
    #x1B[0mresult = func(g, k, *args, **kwargs)#x1B[90m#x1B[39;49;00m
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/methods.py#x1B[0m:200: in wrapper
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m func(f, k, val, _writer=_writer, dataset_kwargs=dataset_kwargs)#x1B[90m#x1B[39;49;00m
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/methods.py#x1B[0m:359: in write_anndata
    #x1B[0m_writer.write_elem(g, #x1B[33m"#x1B[39;49;00m#x1B[33mX#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, adata.X, dataset_kwargs=dataset_kwargs)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/_io/utils.py#x1B[0m:272: in func_wrapper
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m func(*args, **kwargs)#x1B[90m#x1B[39;49;00m
           ^^^^^^^^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/registry.py#x1B[0m:391: in write_elem
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m.callback(#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/_io/zarr.py#x1B[0m:57: in callback
    #x1B[0mwrite_func(store, elem_name, elem, dataset_kwargs=dataset_kwargs)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/registry.py#x1B[0m:78: in wrapper
    #x1B[0mresult = func(g, k, *args, **kwargs)#x1B[90m#x1B[39;49;00m
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/methods.py#x1B[0m:200: in wrapper
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m func(f, k, val, _writer=_writer, dataset_kwargs=dataset_kwargs)#x1B[90m#x1B[39;49;00m
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/_io/utils.py#x1B[0m:332: in func_wrapper
    #x1B[0mfunc(f, k, elem, _writer=_writer, dataset_kwargs=dataset_kwargs)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/methods.py#x1B[0m:519: in write_basic
    #x1B[0m#x1B[94mwith#x1B[39;49;00m zarr_v3_sharding(#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../...../_temp/uv-python-dir/cpython-3.14.5-linux-x86_64-gnu/lib/python3.14/contextlib.py#x1B[0m:141: in __enter__
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m #x1B[96mnext#x1B[39;49;00m(#x1B[96mself#x1B[39;49;00m.gen)#x1B[90m#x1B[39;49;00m
           ^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

dataset_kwargs = {}, format = 3

    #x1B[0m#x1B[37m@contextmanager#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[94mdef#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[92mzarr_v3_sharding#x1B[39;49;00m(dataset_kwargs: #x1B[96mdict#x1B[39;49;00m, #x1B[96mformat#x1B[39;49;00m: Literal[#x1B[94m2#x1B[39;49;00m, #x1B[94m3#x1B[39;49;00m]) -> Generator[#x1B[96mdict#x1B[39;49;00m]:#x1B[90m#x1B[39;49;00m
        auto_sharding = (#x1B[90m#x1B[39;49;00m
            #x1B[33m"#x1B[39;49;00m#x1B[33mshards#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[95min#x1B[39;49;00m dataset_kwargs#x1B[90m#x1B[39;49;00m
            #x1B[95mand#x1B[39;49;00m ad.settings.auto_shard_zarr_v3#x1B[90m#x1B[39;49;00m
            #x1B[95mand#x1B[39;49;00m #x1B[96mformat#x1B[39;49;00m == #x1B[94m3#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        )#x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m ad.settings.auto_shard_zarr_v3 #x1B[95mis#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m #x1B[95mand#x1B[39;49;00m #x1B[96mformat#x1B[39;49;00m == #x1B[94m3#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
>           warnings.warn(#x1B[90m#x1B[39;49;00m
                #x1B[33m"#x1B[39;49;00m#x1B[33mzarr v3 autosharding will be the default in the next minor release.#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                #x1B[96mUserWarning#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                stacklevel=#x1B[94m2#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31mE               UserWarning: zarr v3 autosharding will be the default in the next minor release.#x1B[0m
#x1B[1m#x1B[31mE               Error raised while writing key 'X' of <class 'zarr.core.group.Group'> to /#x1B[0m

#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/methods.py#x1B[0m:129: UserWarning
tests/test_readwrite.py::test_write[default-zarr]
Stack Traces | 0.009s run time
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7f0bab9c2510>
tmp_path = PosixPath('.../pytest-0/popen-gw0/test_write_default_zarr_0')
ext = 'zarr', style = 'default'

    #x1B[0m#x1B[37m@pytest#x1B[39;49;00m.mark.parametrize(#x1B[33m"#x1B[39;49;00m#x1B[33mext#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, [#x1B[33m"#x1B[39;49;00m#x1B[33mh5ad#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, pytest.param(#x1B[33m"#x1B[39;49;00m#x1B[33mzarr#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, marks=needs.zarr), #x1B[33m"#x1B[39;49;00m#x1B[33mcsv#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m])#x1B[90m#x1B[39;49;00m
    #x1B[37m@pytest#x1B[39;49;00m.mark.parametrize(#x1B[33m"#x1B[39;49;00m#x1B[33mstyle#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, [#x1B[33m"#x1B[39;49;00m#x1B[33mpath#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[33m"#x1B[39;49;00m#x1B[33mext#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[33m"#x1B[39;49;00m#x1B[33mdefault#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m])#x1B[90m#x1B[39;49;00m
    #x1B[94mdef#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[92mtest_write#x1B[39;49;00m(#x1B[90m#x1B[39;49;00m
        monkeypatch: pytest.MonkeyPatch,#x1B[90m#x1B[39;49;00m
        tmp_path: Path,#x1B[90m#x1B[39;49;00m
        ext: Literal[#x1B[33m"#x1B[39;49;00m#x1B[33mh5ad#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[33m"#x1B[39;49;00m#x1B[33mzarr#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[33m"#x1B[39;49;00m#x1B[33mcsv#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m],#x1B[90m#x1B[39;49;00m
        style: Literal[#x1B[33m"#x1B[39;49;00m#x1B[33mpath#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[33m"#x1B[39;49;00m#x1B[33mext#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[33m"#x1B[39;49;00m#x1B[33mdefault#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m],#x1B[90m#x1B[39;49;00m
    ) -> #x1B[94mNone#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
        monkeypatch.chdir(tmp_path)#x1B[90m#x1B[39;49;00m
        adata = AnnData(np.array([[#x1B[94m1#x1B[39;49;00m, #x1B[94m2#x1B[39;49;00m], [#x1B[94m3#x1B[39;49;00m, #x1B[94m4#x1B[39;49;00m]]))#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[90m# test that writing works (except style="default" and ext="csv")#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        ctx = (#x1B[90m#x1B[39;49;00m
            pytest.warns(#x1B[96mFutureWarning#x1B[39;49;00m, match=#x1B[33mr#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[33mremoved from this function#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m)#x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m ext == #x1B[33m"#x1B[39;49;00m#x1B[33mcsv#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            #x1B[94melse#x1B[39;49;00m nullcontext()#x1B[90m#x1B[39;49;00m
        )#x1B[90m#x1B[39;49;00m
        #x1B[94mmatch#x1B[39;49;00m style, ext:#x1B[90m#x1B[39;49;00m
            #x1B[94mcase#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[33mpath#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[94m_#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                #x1B[94mwith#x1B[39;49;00m ctx:#x1B[90m#x1B[39;49;00m
                    sc.write(#x1B[33mf#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[33mtest.#x1B[39;49;00m#x1B[33m{#x1B[39;49;00mext#x1B[33m}#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, adata)#x1B[90m#x1B[39;49;00m
                d = tmp_path#x1B[90m#x1B[39;49;00m
            #x1B[94mcase#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[33mext#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[94m_#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                #x1B[94mwith#x1B[39;49;00m ctx:#x1B[90m#x1B[39;49;00m
                    sc.write(#x1B[33m"#x1B[39;49;00m#x1B[33mtest#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, adata, ext=ext)#x1B[90m#x1B[39;49;00m
                d = sc.settings.writedir#x1B[90m#x1B[39;49;00m
            #x1B[94mcase#x1B[39;49;00m #x1B[33m"#x1B[39;49;00m#x1B[33mdefault#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[33m"#x1B[39;49;00m#x1B[33mcsv#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                #x1B[90m# check that it throws an error instead#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
                ff = sc.settings.file_format_data#x1B[90m#x1B[39;49;00m
                #x1B[94mwith#x1B[39;49;00m pytest.raises(#x1B[96mValueError#x1B[39;49;00m, match=#x1B[33mr#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[33mshould be #x1B[39;49;00m#x1B[33m'#x1B[39;49;00m#x1B[33mh5ad#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m#x1B[33m or #x1B[39;49;00m#x1B[33m'#x1B[39;49;00m#x1B[33mzarr#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m#x1B[33m.*#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m#x1B[33mcsv#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m):#x1B[90m#x1B[39;49;00m
                    sc.settings.file_format_data = ext  #x1B[90m# type: ignore[assignment]#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
                #x1B[94massert#x1B[39;49;00m sc.settings.file_format_data == ff#x1B[90m#x1B[39;49;00m
                #x1B[94mreturn#x1B[39;49;00m  #x1B[90m# return early#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            #x1B[94mcase#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[33mdefault#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[94m_#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                sc.settings.file_format_data, old = ext, sc.settings.file_format_data#x1B[90m#x1B[39;49;00m
                #x1B[94mtry#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                    #x1B[94mwith#x1B[39;49;00m ctx:#x1B[90m#x1B[39;49;00m
>                       sc.write(#x1B[33m"#x1B[39;49;00m#x1B[33mtest#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, adata)#x1B[90m#x1B[39;49;00m

#x1B[1m#x1B[.../scanpy/tests/test_readwrite.py#x1B[0m:84: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
#x1B[1m#x1B[.../src/scanpy/readwrite.py#x1B[0m:746: in write
    #x1B[0mwrite_zarr(filename, adata, **extra_kw)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/_io/utils.py#x1B[0m:349: in raise_error_if_dataset_2d_present
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m write(store, adata, *args, **kwargs)#x1B[90m#x1B[39;49;00m
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/_io/zarr.py#x1B[0m:59: in write_zarr
    #x1B[0mwrite_dispatched(f, #x1B[33m"#x1B[39;49;00m#x1B[33m/#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, adata, callback=callback, dataset_kwargs=ds_kwargs)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/experimental/_dispatch_io.py#x1B[0m:74: in write_dispatched
    #x1B[0mwriter.write_elem(store, key, elem, dataset_kwargs=dataset_kwargs)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/_io/utils.py#x1B[0m:272: in func_wrapper
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m func(*args, **kwargs)#x1B[90m#x1B[39;49;00m
           ^^^^^^^^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/registry.py#x1B[0m:391: in write_elem
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m.callback(#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/_io/zarr.py#x1B[0m:57: in callback
    #x1B[0mwrite_func(store, elem_name, elem, dataset_kwargs=dataset_kwargs)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/registry.py#x1B[0m:78: in wrapper
    #x1B[0mresult = func(g, k, *args, **kwargs)#x1B[90m#x1B[39;49;00m
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/methods.py#x1B[0m:200: in wrapper
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m func(f, k, val, _writer=_writer, dataset_kwargs=dataset_kwargs)#x1B[90m#x1B[39;49;00m
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/methods.py#x1B[0m:359: in write_anndata
    #x1B[0m_writer.write_elem(g, #x1B[33m"#x1B[39;49;00m#x1B[33mX#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, adata.X, dataset_kwargs=dataset_kwargs)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/_io/utils.py#x1B[0m:272: in func_wrapper
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m func(*args, **kwargs)#x1B[90m#x1B[39;49;00m
           ^^^^^^^^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/registry.py#x1B[0m:391: in write_elem
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m.callback(#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/_io/zarr.py#x1B[0m:57: in callback
    #x1B[0mwrite_func(store, elem_name, elem, dataset_kwargs=dataset_kwargs)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/registry.py#x1B[0m:78: in wrapper
    #x1B[0mresult = func(g, k, *args, **kwargs)#x1B[90m#x1B[39;49;00m
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/methods.py#x1B[0m:200: in wrapper
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m func(f, k, val, _writer=_writer, dataset_kwargs=dataset_kwargs)#x1B[90m#x1B[39;49;00m
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/_io/utils.py#x1B[0m:332: in func_wrapper
    #x1B[0mfunc(f, k, elem, _writer=_writer, dataset_kwargs=dataset_kwargs)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/methods.py#x1B[0m:519: in write_basic
    #x1B[0m#x1B[94mwith#x1B[39;49;00m zarr_v3_sharding(#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../_temp/uv-python-dir/cpython-3.14.5-linux-x86_64-gnu/lib/python3.14/contextlib.py#x1B[0m:141: in __enter__
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m #x1B[96mnext#x1B[39;49;00m(#x1B[96mself#x1B[39;49;00m.gen)#x1B[90m#x1B[39;49;00m
           ^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

dataset_kwargs = {}, format = 3

    #x1B[0m#x1B[37m@contextmanager#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[94mdef#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[92mzarr_v3_sharding#x1B[39;49;00m(dataset_kwargs: #x1B[96mdict#x1B[39;49;00m, #x1B[96mformat#x1B[39;49;00m: Literal[#x1B[94m2#x1B[39;49;00m, #x1B[94m3#x1B[39;49;00m]) -> Generator[#x1B[96mdict#x1B[39;49;00m]:#x1B[90m#x1B[39;49;00m
        auto_sharding = (#x1B[90m#x1B[39;49;00m
            #x1B[33m"#x1B[39;49;00m#x1B[33mshards#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[95min#x1B[39;49;00m dataset_kwargs#x1B[90m#x1B[39;49;00m
            #x1B[95mand#x1B[39;49;00m ad.settings.auto_shard_zarr_v3#x1B[90m#x1B[39;49;00m
            #x1B[95mand#x1B[39;49;00m #x1B[96mformat#x1B[39;49;00m == #x1B[94m3#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        )#x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m ad.settings.auto_shard_zarr_v3 #x1B[95mis#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m #x1B[95mand#x1B[39;49;00m #x1B[96mformat#x1B[39;49;00m == #x1B[94m3#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
>           warnings.warn(#x1B[90m#x1B[39;49;00m
                #x1B[33m"#x1B[39;49;00m#x1B[33mzarr v3 autosharding will be the default in the next minor release.#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                #x1B[96mUserWarning#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                stacklevel=#x1B[94m2#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31mE               UserWarning: zarr v3 autosharding will be the default in the next minor release.#x1B[0m
#x1B[1m#x1B[31mE               Error raised while writing key 'X' of <class 'zarr.core.group.Group'> to /#x1B[0m

#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/methods.py#x1B[0m:129: UserWarning
tests/test_readwrite.py::test_write_strings_to_cats[s2c-zarr]
Stack Traces | 0.009s run time
fmt = 'zarr'

    #x1B[0m#x1B[37m@pytest#x1B[39;49;00m.mark.skipif(#x1B[90m#x1B[39;49;00m
        pkg_version(#x1B[33m"#x1B[39;49;00m#x1B[33manndata#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m) < Version(#x1B[33m"#x1B[39;49;00m#x1B[33m0.11.0rc2#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m),#x1B[90m#x1B[39;49;00m
        reason=#x1B[33m"#x1B[39;49;00m#x1B[33mOlder AnnData has no convert_strings_to_categoricals#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
    )#x1B[90m#x1B[39;49;00m
    #x1B[37m@pytest#x1B[39;49;00m.mark.parametrize(#x1B[33m"#x1B[39;49;00m#x1B[33mfmt#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, [#x1B[33m"#x1B[39;49;00m#x1B[33mh5ad#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, pytest.param(#x1B[33m"#x1B[39;49;00m#x1B[33mzarr#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, marks=needs.zarr)])#x1B[90m#x1B[39;49;00m
    #x1B[37m@pytest#x1B[39;49;00m.mark.parametrize(#x1B[33m"#x1B[39;49;00m#x1B[33ms2c#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, [#x1B[94mTrue#x1B[39;49;00m, #x1B[94mFalse#x1B[39;49;00m], ids=[#x1B[33m"#x1B[39;49;00m#x1B[33ms2c#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[33m"#x1B[39;49;00m#x1B[33mno_s2c#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m])#x1B[90m#x1B[39;49;00m
    #x1B[94mdef#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[92mtest_write_strings_to_cats#x1B[39;49;00m(fmt: Literal[#x1B[33m"#x1B[39;49;00m#x1B[33mh5ad#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[33m"#x1B[39;49;00m#x1B[33mzarr#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m], *, s2c: #x1B[96mbool#x1B[39;49;00m) -> #x1B[94mNone#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
        adata = AnnData(np.array([[#x1B[94m1#x1B[39;49;00m, #x1B[94m2#x1B[39;49;00m], [#x1B[94m3#x1B[39;49;00m, #x1B[94m4#x1B[39;49;00m], [#x1B[94m5#x1B[39;49;00m, #x1B[94m6#x1B[39;49;00m]]), obs=#x1B[96mdict#x1B[39;49;00m(a=[#x1B[33m"#x1B[39;49;00m#x1B[33ma#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[33m"#x1B[39;49;00m#x1B[33mb#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[33m"#x1B[39;49;00m#x1B[33ma#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m]))#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
>       sc.write(#x1B[33m"#x1B[39;49;00m#x1B[33mtest#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, adata, convert_strings_to_categoricals=s2c, ext=fmt)#x1B[90m#x1B[39;49;00m

#x1B[1m#x1B[31mtests/test_readwrite.py#x1B[0m:110: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
#x1B[1m#x1B[31msrc/scanpy/readwrite.py#x1B[0m:746: in write
    #x1B[0mwrite_zarr(filename, adata, **extra_kw)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/_io/utils.py#x1B[0m:349: in raise_error_if_dataset_2d_present
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m write(store, adata, *args, **kwargs)#x1B[90m#x1B[39;49;00m
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/_io/zarr.py#x1B[0m:59: in write_zarr
    #x1B[0mwrite_dispatched(f, #x1B[33m"#x1B[39;49;00m#x1B[33m/#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, adata, callback=callback, dataset_kwargs=ds_kwargs)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/experimental/_dispatch_io.py#x1B[0m:74: in write_dispatched
    #x1B[0mwriter.write_elem(store, key, elem, dataset_kwargs=dataset_kwargs)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/_io/utils.py#x1B[0m:272: in func_wrapper
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m func(*args, **kwargs)#x1B[90m#x1B[39;49;00m
           ^^^^^^^^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/registry.py#x1B[0m:391: in write_elem
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m.callback(#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/_io/zarr.py#x1B[0m:57: in callback
    #x1B[0mwrite_func(store, elem_name, elem, dataset_kwargs=dataset_kwargs)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/registry.py#x1B[0m:78: in wrapper
    #x1B[0mresult = func(g, k, *args, **kwargs)#x1B[90m#x1B[39;49;00m
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/methods.py#x1B[0m:200: in wrapper
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m func(f, k, val, _writer=_writer, dataset_kwargs=dataset_kwargs)#x1B[90m#x1B[39;49;00m
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/methods.py#x1B[0m:359: in write_anndata
    #x1B[0m_writer.write_elem(g, #x1B[33m"#x1B[39;49;00m#x1B[33mX#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, adata.X, dataset_kwargs=dataset_kwargs)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/_io/utils.py#x1B[0m:272: in func_wrapper
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m func(*args, **kwargs)#x1B[90m#x1B[39;49;00m
           ^^^^^^^^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/registry.py#x1B[0m:391: in write_elem
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m.callback(#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/_io/zarr.py#x1B[0m:57: in callback
    #x1B[0mwrite_func(store, elem_name, elem, dataset_kwargs=dataset_kwargs)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/registry.py#x1B[0m:78: in wrapper
    #x1B[0mresult = func(g, k, *args, **kwargs)#x1B[90m#x1B[39;49;00m
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/methods.py#x1B[0m:200: in wrapper
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m func(f, k, val, _writer=_writer, dataset_kwargs=dataset_kwargs)#x1B[90m#x1B[39;49;00m
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/_io/utils.py#x1B[0m:332: in func_wrapper
    #x1B[0mfunc(f, k, elem, _writer=_writer, dataset_kwargs=dataset_kwargs)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/methods.py#x1B[0m:519: in write_basic
    #x1B[0m#x1B[94mwith#x1B[39;49;00m zarr_v3_sharding(#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../...../_temp/uv-python-dir/cpython-3.14.5-linux-x86_64-gnu/lib/python3.14/contextlib.py#x1B[0m:141: in __enter__
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m #x1B[96mnext#x1B[39;49;00m(#x1B[96mself#x1B[39;49;00m.gen)#x1B[90m#x1B[39;49;00m
           ^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

dataset_kwargs = {}, format = 3

    #x1B[0m#x1B[37m@contextmanager#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[94mdef#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[92mzarr_v3_sharding#x1B[39;49;00m(dataset_kwargs: #x1B[96mdict#x1B[39;49;00m, #x1B[96mformat#x1B[39;49;00m: Literal[#x1B[94m2#x1B[39;49;00m, #x1B[94m3#x1B[39;49;00m]) -> Generator[#x1B[96mdict#x1B[39;49;00m]:#x1B[90m#x1B[39;49;00m
        auto_sharding = (#x1B[90m#x1B[39;49;00m
            #x1B[33m"#x1B[39;49;00m#x1B[33mshards#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[95min#x1B[39;49;00m dataset_kwargs#x1B[90m#x1B[39;49;00m
            #x1B[95mand#x1B[39;49;00m ad.settings.auto_shard_zarr_v3#x1B[90m#x1B[39;49;00m
            #x1B[95mand#x1B[39;49;00m #x1B[96mformat#x1B[39;49;00m == #x1B[94m3#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        )#x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m ad.settings.auto_shard_zarr_v3 #x1B[95mis#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m #x1B[95mand#x1B[39;49;00m #x1B[96mformat#x1B[39;49;00m == #x1B[94m3#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
>           warnings.warn(#x1B[90m#x1B[39;49;00m
                #x1B[33m"#x1B[39;49;00m#x1B[33mzarr v3 autosharding will be the default in the next minor release.#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                #x1B[96mUserWarning#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                stacklevel=#x1B[94m2#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31mE               UserWarning: zarr v3 autosharding will be the default in the next minor release.#x1B[0m
#x1B[1m#x1B[31mE               Error raised while writing key 'X' of <class 'zarr.core.group.Group'> to /#x1B[0m

#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/methods.py#x1B[0m:129: UserWarning
tests/test_readwrite.py::test_write[ext-zarr]
Stack Traces | 0.01s run time
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7f0bb82452b0>
tmp_path = PosixPath('.../pytest-0/popen-gw0/test_write_ext_zarr_0')
ext = 'zarr', style = 'ext'

    #x1B[0m#x1B[37m@pytest#x1B[39;49;00m.mark.parametrize(#x1B[33m"#x1B[39;49;00m#x1B[33mext#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, [#x1B[33m"#x1B[39;49;00m#x1B[33mh5ad#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, pytest.param(#x1B[33m"#x1B[39;49;00m#x1B[33mzarr#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, marks=needs.zarr), #x1B[33m"#x1B[39;49;00m#x1B[33mcsv#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m])#x1B[90m#x1B[39;49;00m
    #x1B[37m@pytest#x1B[39;49;00m.mark.parametrize(#x1B[33m"#x1B[39;49;00m#x1B[33mstyle#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, [#x1B[33m"#x1B[39;49;00m#x1B[33mpath#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[33m"#x1B[39;49;00m#x1B[33mext#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[33m"#x1B[39;49;00m#x1B[33mdefault#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m])#x1B[90m#x1B[39;49;00m
    #x1B[94mdef#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[92mtest_write#x1B[39;49;00m(#x1B[90m#x1B[39;49;00m
        monkeypatch: pytest.MonkeyPatch,#x1B[90m#x1B[39;49;00m
        tmp_path: Path,#x1B[90m#x1B[39;49;00m
        ext: Literal[#x1B[33m"#x1B[39;49;00m#x1B[33mh5ad#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[33m"#x1B[39;49;00m#x1B[33mzarr#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[33m"#x1B[39;49;00m#x1B[33mcsv#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m],#x1B[90m#x1B[39;49;00m
        style: Literal[#x1B[33m"#x1B[39;49;00m#x1B[33mpath#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[33m"#x1B[39;49;00m#x1B[33mext#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[33m"#x1B[39;49;00m#x1B[33mdefault#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m],#x1B[90m#x1B[39;49;00m
    ) -> #x1B[94mNone#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
        monkeypatch.chdir(tmp_path)#x1B[90m#x1B[39;49;00m
        adata = AnnData(np.array([[#x1B[94m1#x1B[39;49;00m, #x1B[94m2#x1B[39;49;00m], [#x1B[94m3#x1B[39;49;00m, #x1B[94m4#x1B[39;49;00m]]))#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[90m# test that writing works (except style="default" and ext="csv")#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        ctx = (#x1B[90m#x1B[39;49;00m
            pytest.warns(#x1B[96mFutureWarning#x1B[39;49;00m, match=#x1B[33mr#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[33mremoved from this function#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m)#x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m ext == #x1B[33m"#x1B[39;49;00m#x1B[33mcsv#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            #x1B[94melse#x1B[39;49;00m nullcontext()#x1B[90m#x1B[39;49;00m
        )#x1B[90m#x1B[39;49;00m
        #x1B[94mmatch#x1B[39;49;00m style, ext:#x1B[90m#x1B[39;49;00m
            #x1B[94mcase#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[33mpath#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[94m_#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                #x1B[94mwith#x1B[39;49;00m ctx:#x1B[90m#x1B[39;49;00m
                    sc.write(#x1B[33mf#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[33mtest.#x1B[39;49;00m#x1B[33m{#x1B[39;49;00mext#x1B[33m}#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, adata)#x1B[90m#x1B[39;49;00m
                d = tmp_path#x1B[90m#x1B[39;49;00m
            #x1B[94mcase#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[33mext#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[94m_#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                #x1B[94mwith#x1B[39;49;00m ctx:#x1B[90m#x1B[39;49;00m
>                   sc.write(#x1B[33m"#x1B[39;49;00m#x1B[33mtest#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, adata, ext=ext)#x1B[90m#x1B[39;49;00m

#x1B[1m#x1B[.../scanpy/tests/test_readwrite.py#x1B[0m:71: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
#x1B[1m#x1B[.../src/scanpy/readwrite.py#x1B[0m:746: in write
    #x1B[0mwrite_zarr(filename, adata, **extra_kw)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/_io/utils.py#x1B[0m:349: in raise_error_if_dataset_2d_present
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m write(store, adata, *args, **kwargs)#x1B[90m#x1B[39;49;00m
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/_io/zarr.py#x1B[0m:59: in write_zarr
    #x1B[0mwrite_dispatched(f, #x1B[33m"#x1B[39;49;00m#x1B[33m/#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, adata, callback=callback, dataset_kwargs=ds_kwargs)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/experimental/_dispatch_io.py#x1B[0m:74: in write_dispatched
    #x1B[0mwriter.write_elem(store, key, elem, dataset_kwargs=dataset_kwargs)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/_io/utils.py#x1B[0m:272: in func_wrapper
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m func(*args, **kwargs)#x1B[90m#x1B[39;49;00m
           ^^^^^^^^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/registry.py#x1B[0m:391: in write_elem
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m.callback(#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/_io/zarr.py#x1B[0m:57: in callback
    #x1B[0mwrite_func(store, elem_name, elem, dataset_kwargs=dataset_kwargs)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/registry.py#x1B[0m:78: in wrapper
    #x1B[0mresult = func(g, k, *args, **kwargs)#x1B[90m#x1B[39;49;00m
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/methods.py#x1B[0m:200: in wrapper
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m func(f, k, val, _writer=_writer, dataset_kwargs=dataset_kwargs)#x1B[90m#x1B[39;49;00m
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/methods.py#x1B[0m:359: in write_anndata
    #x1B[0m_writer.write_elem(g, #x1B[33m"#x1B[39;49;00m#x1B[33mX#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, adata.X, dataset_kwargs=dataset_kwargs)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/_io/utils.py#x1B[0m:272: in func_wrapper
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m func(*args, **kwargs)#x1B[90m#x1B[39;49;00m
           ^^^^^^^^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/registry.py#x1B[0m:391: in write_elem
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m.callback(#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/_io/zarr.py#x1B[0m:57: in callback
    #x1B[0mwrite_func(store, elem_name, elem, dataset_kwargs=dataset_kwargs)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/registry.py#x1B[0m:78: in wrapper
    #x1B[0mresult = func(g, k, *args, **kwargs)#x1B[90m#x1B[39;49;00m
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/methods.py#x1B[0m:200: in wrapper
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m func(f, k, val, _writer=_writer, dataset_kwargs=dataset_kwargs)#x1B[90m#x1B[39;49;00m
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/_io/utils.py#x1B[0m:332: in func_wrapper
    #x1B[0mfunc(f, k, elem, _writer=_writer, dataset_kwargs=dataset_kwargs)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/methods.py#x1B[0m:519: in write_basic
    #x1B[0m#x1B[94mwith#x1B[39;49;00m zarr_v3_sharding(#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../_temp/uv-python-dir/cpython-3.14.5-linux-x86_64-gnu/lib/python3.14/contextlib.py#x1B[0m:141: in __enter__
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m #x1B[96mnext#x1B[39;49;00m(#x1B[96mself#x1B[39;49;00m.gen)#x1B[90m#x1B[39;49;00m
           ^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

dataset_kwargs = {}, format = 3

    #x1B[0m#x1B[37m@contextmanager#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[94mdef#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[92mzarr_v3_sharding#x1B[39;49;00m(dataset_kwargs: #x1B[96mdict#x1B[39;49;00m, #x1B[96mformat#x1B[39;49;00m: Literal[#x1B[94m2#x1B[39;49;00m, #x1B[94m3#x1B[39;49;00m]) -> Generator[#x1B[96mdict#x1B[39;49;00m]:#x1B[90m#x1B[39;49;00m
        auto_sharding = (#x1B[90m#x1B[39;49;00m
            #x1B[33m"#x1B[39;49;00m#x1B[33mshards#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[95min#x1B[39;49;00m dataset_kwargs#x1B[90m#x1B[39;49;00m
            #x1B[95mand#x1B[39;49;00m ad.settings.auto_shard_zarr_v3#x1B[90m#x1B[39;49;00m
            #x1B[95mand#x1B[39;49;00m #x1B[96mformat#x1B[39;49;00m == #x1B[94m3#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        )#x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m ad.settings.auto_shard_zarr_v3 #x1B[95mis#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m #x1B[95mand#x1B[39;49;00m #x1B[96mformat#x1B[39;49;00m == #x1B[94m3#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
>           warnings.warn(#x1B[90m#x1B[39;49;00m
                #x1B[33m"#x1B[39;49;00m#x1B[33mzarr v3 autosharding will be the default in the next minor release.#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                #x1B[96mUserWarning#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                stacklevel=#x1B[94m2#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31mE               UserWarning: zarr v3 autosharding will be the default in the next minor release.#x1B[0m
#x1B[1m#x1B[31mE               Error raised while writing key 'X' of <class 'zarr.core.group.Group'> to /#x1B[0m

#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/methods.py#x1B[0m:129: UserWarning
tests/test_readwrite.py::test_write[path-zarr]
Stack Traces | 0.011s run time
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7f0babd71630>
tmp_path = PosixPath('.../pytest-0/popen-gw0/test_write_path_zarr_0')
ext = 'zarr', style = 'path'

    #x1B[0m#x1B[37m@pytest#x1B[39;49;00m.mark.parametrize(#x1B[33m"#x1B[39;49;00m#x1B[33mext#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, [#x1B[33m"#x1B[39;49;00m#x1B[33mh5ad#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, pytest.param(#x1B[33m"#x1B[39;49;00m#x1B[33mzarr#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, marks=needs.zarr), #x1B[33m"#x1B[39;49;00m#x1B[33mcsv#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m])#x1B[90m#x1B[39;49;00m
    #x1B[37m@pytest#x1B[39;49;00m.mark.parametrize(#x1B[33m"#x1B[39;49;00m#x1B[33mstyle#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, [#x1B[33m"#x1B[39;49;00m#x1B[33mpath#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[33m"#x1B[39;49;00m#x1B[33mext#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[33m"#x1B[39;49;00m#x1B[33mdefault#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m])#x1B[90m#x1B[39;49;00m
    #x1B[94mdef#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[92mtest_write#x1B[39;49;00m(#x1B[90m#x1B[39;49;00m
        monkeypatch: pytest.MonkeyPatch,#x1B[90m#x1B[39;49;00m
        tmp_path: Path,#x1B[90m#x1B[39;49;00m
        ext: Literal[#x1B[33m"#x1B[39;49;00m#x1B[33mh5ad#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[33m"#x1B[39;49;00m#x1B[33mzarr#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[33m"#x1B[39;49;00m#x1B[33mcsv#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m],#x1B[90m#x1B[39;49;00m
        style: Literal[#x1B[33m"#x1B[39;49;00m#x1B[33mpath#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[33m"#x1B[39;49;00m#x1B[33mext#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[33m"#x1B[39;49;00m#x1B[33mdefault#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m],#x1B[90m#x1B[39;49;00m
    ) -> #x1B[94mNone#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
        monkeypatch.chdir(tmp_path)#x1B[90m#x1B[39;49;00m
        adata = AnnData(np.array([[#x1B[94m1#x1B[39;49;00m, #x1B[94m2#x1B[39;49;00m], [#x1B[94m3#x1B[39;49;00m, #x1B[94m4#x1B[39;49;00m]]))#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[90m# test that writing works (except style="default" and ext="csv")#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        ctx = (#x1B[90m#x1B[39;49;00m
            pytest.warns(#x1B[96mFutureWarning#x1B[39;49;00m, match=#x1B[33mr#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[33mremoved from this function#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m)#x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m ext == #x1B[33m"#x1B[39;49;00m#x1B[33mcsv#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
            #x1B[94melse#x1B[39;49;00m nullcontext()#x1B[90m#x1B[39;49;00m
        )#x1B[90m#x1B[39;49;00m
        #x1B[94mmatch#x1B[39;49;00m style, ext:#x1B[90m#x1B[39;49;00m
            #x1B[94mcase#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[33mpath#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[94m_#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                #x1B[94mwith#x1B[39;49;00m ctx:#x1B[90m#x1B[39;49;00m
>                   sc.write(#x1B[33mf#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[33mtest.#x1B[39;49;00m#x1B[33m{#x1B[39;49;00mext#x1B[33m}#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, adata)#x1B[90m#x1B[39;49;00m

#x1B[1m#x1B[.../scanpy/tests/test_readwrite.py#x1B[0m:67: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
#x1B[1m#x1B[.../src/scanpy/readwrite.py#x1B[0m:746: in write
    #x1B[0mwrite_zarr(filename, adata, **extra_kw)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/_io/utils.py#x1B[0m:349: in raise_error_if_dataset_2d_present
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m write(store, adata, *args, **kwargs)#x1B[90m#x1B[39;49;00m
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/_io/zarr.py#x1B[0m:59: in write_zarr
    #x1B[0mwrite_dispatched(f, #x1B[33m"#x1B[39;49;00m#x1B[33m/#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, adata, callback=callback, dataset_kwargs=ds_kwargs)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/experimental/_dispatch_io.py#x1B[0m:74: in write_dispatched
    #x1B[0mwriter.write_elem(store, key, elem, dataset_kwargs=dataset_kwargs)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/_io/utils.py#x1B[0m:272: in func_wrapper
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m func(*args, **kwargs)#x1B[90m#x1B[39;49;00m
           ^^^^^^^^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/registry.py#x1B[0m:391: in write_elem
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m.callback(#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/_io/zarr.py#x1B[0m:57: in callback
    #x1B[0mwrite_func(store, elem_name, elem, dataset_kwargs=dataset_kwargs)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/registry.py#x1B[0m:78: in wrapper
    #x1B[0mresult = func(g, k, *args, **kwargs)#x1B[90m#x1B[39;49;00m
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/methods.py#x1B[0m:200: in wrapper
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m func(f, k, val, _writer=_writer, dataset_kwargs=dataset_kwargs)#x1B[90m#x1B[39;49;00m
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/methods.py#x1B[0m:359: in write_anndata
    #x1B[0m_writer.write_elem(g, #x1B[33m"#x1B[39;49;00m#x1B[33mX#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, adata.X, dataset_kwargs=dataset_kwargs)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/_io/utils.py#x1B[0m:272: in func_wrapper
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m func(*args, **kwargs)#x1B[90m#x1B[39;49;00m
           ^^^^^^^^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/registry.py#x1B[0m:391: in write_elem
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m.callback(#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/_io/zarr.py#x1B[0m:57: in callback
    #x1B[0mwrite_func(store, elem_name, elem, dataset_kwargs=dataset_kwargs)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/registry.py#x1B[0m:78: in wrapper
    #x1B[0mresult = func(g, k, *args, **kwargs)#x1B[90m#x1B[39;49;00m
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/methods.py#x1B[0m:200: in wrapper
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m func(f, k, val, _writer=_writer, dataset_kwargs=dataset_kwargs)#x1B[90m#x1B[39;49;00m
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../anndata/_io/utils.py#x1B[0m:332: in func_wrapper
    #x1B[0mfunc(f, k, elem, _writer=_writer, dataset_kwargs=dataset_kwargs)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/methods.py#x1B[0m:519: in write_basic
    #x1B[0m#x1B[94mwith#x1B[39;49;00m zarr_v3_sharding(#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../_temp/uv-python-dir/cpython-3.14.5-linux-x86_64-gnu/lib/python3.14/contextlib.py#x1B[0m:141: in __enter__
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m #x1B[96mnext#x1B[39;49;00m(#x1B[96mself#x1B[39;49;00m.gen)#x1B[90m#x1B[39;49;00m
           ^^^^^^^^^^^^^^#x1B[90m#x1B[39;49;00m
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

dataset_kwargs = {}, format = 3

    #x1B[0m#x1B[37m@contextmanager#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[94mdef#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[92mzarr_v3_sharding#x1B[39;49;00m(dataset_kwargs: #x1B[96mdict#x1B[39;49;00m, #x1B[96mformat#x1B[39;49;00m: Literal[#x1B[94m2#x1B[39;49;00m, #x1B[94m3#x1B[39;49;00m]) -> Generator[#x1B[96mdict#x1B[39;49;00m]:#x1B[90m#x1B[39;49;00m
        auto_sharding = (#x1B[90m#x1B[39;49;00m
            #x1B[33m"#x1B[39;49;00m#x1B[33mshards#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[95min#x1B[39;49;00m dataset_kwargs#x1B[90m#x1B[39;49;00m
            #x1B[95mand#x1B[39;49;00m ad.settings.auto_shard_zarr_v3#x1B[90m#x1B[39;49;00m
            #x1B[95mand#x1B[39;49;00m #x1B[96mformat#x1B[39;49;00m == #x1B[94m3#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        )#x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m ad.settings.auto_shard_zarr_v3 #x1B[95mis#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m #x1B[95mand#x1B[39;49;00m #x1B[96mformat#x1B[39;49;00m == #x1B[94m3#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
>           warnings.warn(#x1B[90m#x1B[39;49;00m
                #x1B[33m"#x1B[39;49;00m#x1B[33mzarr v3 autosharding will be the default in the next minor release.#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                #x1B[96mUserWarning#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                stacklevel=#x1B[94m2#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31mE               UserWarning: zarr v3 autosharding will be the default in the next minor release.#x1B[0m
#x1B[1m#x1B[31mE               Error raised while writing key 'X' of <class 'zarr.core.group.Group'> to /#x1B[0m

#x1B[1m#x1B[.../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.few-extras/lib/python3.14.../_io/specs/methods.py#x1B[0m:129: UserWarning

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

@scverse-benchmark
Copy link
Copy Markdown

scverse-benchmark Bot commented Mar 26, 2026

Benchmark changes

Change Before [45325b1] After [cf65665] Ratio Benchmark (Parameter)
! 22.7±0s failed n/a preprocessing_log.HVGSuite.time_highly_variable_genes('seurat', True)

Warning

Some benchmarks failed

Comparison: https://github.com/scverse/scanpy/compare/45325b1ab09e6bcfc6b5988d82027f8694353789..cf65665a6591de5158c94013474ac051358f065b
Last changed: Tue, 5 May 2026 13:59:35 +0000

More details: https://github.com/scverse/scanpy/pull/4013/checks?check_run_id=74416579162

@flying-sheep flying-sheep modified the milestones: 1.12.1, 1.12.2 Apr 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants