Skip to content

Commit e21b1b7

Browse files
Backport PR #2102 on branch 0.12.x (chore: deprecate AnnData.*_keys methods) (#2108)
Co-authored-by: Philipp A <flying-sheep@web.de>
1 parent eb07ed1 commit e21b1b7

6 files changed

Lines changed: 24 additions & 12 deletions

File tree

docs/release-notes/2102.chore.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Deprecate `AnnData.*_keys()` methods. {user}`flying-sheep`

src/anndata/_core/anndata.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -936,22 +936,27 @@ def uns(self):
936936
Is sliced with `data` and `var` but behaves otherwise like a :term:`mapping`.
937937
"""
938938

939+
@deprecated("obs (e.g. `k in adata.obs` or `str(adata.obs.columns.tolist())`)")
939940
def obs_keys(self) -> list[str]:
940941
"""List keys of observation annotation :attr:`obs`."""
941942
return self._obs.keys().tolist()
942943

944+
@deprecated("var (e.g. `k in adata.var` or `str(adata.var.columns.tolist())`)")
943945
def var_keys(self) -> list[str]:
944946
"""List keys of variable annotation :attr:`var`."""
945947
return self._var.keys().tolist()
946948

949+
@deprecated("obsm (e.g. `k in adata.obsm` or `adata.obsm.keys() | {'u'}`)")
947950
def obsm_keys(self) -> list[str]:
948951
"""List keys of observation annotation :attr:`obsm`."""
949952
return list(self.obsm.keys())
950953

954+
@deprecated("varm (e.g. `k in adata.varm` or `adata.varm.keys() | {'u'}`)")
951955
def varm_keys(self) -> list[str]:
952956
"""List keys of variable annotation :attr:`varm`."""
953957
return list(self.varm.keys())
954958

959+
@deprecated("uns (e.g. `k in adata.uns` or `sorted(adata.uns)`)")
955960
def uns_keys(self) -> list[str]:
956961
"""List keys of unstructured annotation."""
957962
return sorted(self._uns.keys())

tests/test_base.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -515,10 +515,10 @@ def test_append_col():
515515

516516
def test_delete_col():
517517
adata = AnnData(np.array([[1, 2, 3], [4, 5, 6]]), dict(o1=[1, 2], o2=[3, 4]))
518-
assert adata.obs_keys() == ["o1", "o2"]
518+
assert adata.obs.columns.tolist() == ["o1", "o2"]
519519

520520
del adata.obs["o1"]
521-
assert adata.obs_keys() == ["o2"]
521+
assert adata.obs.columns.tolist() == ["o2"]
522522
assert adata.obs["o2"].tolist() == [3, 4]
523523

524524

@@ -536,7 +536,7 @@ def test_multicol():
536536
adata = AnnData(np.array([[1, 2, 3], [4, 5, 6]]))
537537
# 'c' keeps the columns as should be
538538
adata.obsm["c"] = np.array([[0.0, 1.0], [2, 3]])
539-
assert adata.obsm_keys() == ["c"]
539+
assert adata.obsm.keys() == {"c"}
540540
assert adata.obsm["c"].tolist() == [[0.0, 1.0], [2, 3]]
541541

542542

tests/test_concatenate.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -315,15 +315,15 @@ def test_concatenate_dense():
315315
X_combined = [[2, 3], [5, 6], [3, 2], [6, 5], [3, 2], [6, 5]]
316316
assert adata.X.astype(int).tolist() == X_combined
317317
assert adata.layers["Xs"].astype(int).tolist() == X_combined
318-
assert adata.obs_keys() == ["anno1", "anno2", "batch"]
319-
assert adata.var_keys() == ["annoA-0", "annoA-1", "annoB-2"]
318+
assert adata.obs.columns.tolist() == ["anno1", "anno2", "batch"]
319+
assert adata.var.columns.tolist() == ["annoA-0", "annoA-1", "annoB-2"]
320320
assert adata.var.values.tolist() == [[1, 2, 2], [2, 1, 1]]
321-
assert adata.obsm_keys() == ["X_1", "X_2"]
321+
assert adata.obsm.keys() == {"X_1", "X_2"}
322322
assert adata.obsm["X_1"].tolist() == np.concatenate([X1, X1, X1]).tolist()
323323

324324
# with batch_key and batch_categories
325325
adata = adata1.concatenate(adata2, adata3, batch_key="batch1")
326-
assert adata.obs_keys() == ["anno1", "anno2", "batch1"]
326+
assert adata.obs.columns.tolist() == ["anno1", "anno2", "batch1"]
327327
adata = adata1.concatenate(adata2, adata3, batch_categories=["a1", "a2", "a3"])
328328
assert adata.obs["batch"].cat.categories.tolist() == ["a1", "a2", "a3"]
329329
assert adata.var_names.tolist() == ["b", "c"]
@@ -644,7 +644,7 @@ def test_concatenate_dense_duplicates():
644644
)
645645

646646
adata = adata1.concatenate(adata2, adata3)
647-
assert adata.var_keys() == [
647+
assert adata.var.columns.tolist() == [
648648
"annoA",
649649
"annoB",
650650
"annoC-0",

tests/test_deprecations.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,3 +134,9 @@ def test_warn_on_deprecated__io_module():
134134
FutureWarning, match=r"Importing read_h5ad from `anndata._io` is deprecated"
135135
):
136136
from anndata._io import read_h5ad # noqa
137+
138+
139+
@pytest.mark.parametrize("name", ["obs", "var", "obsm", "varm", "uns"])
140+
def test_keys_function_warns(adata: AnnData, name) -> None:
141+
with pytest.warns(FutureWarning, match=rf"{name}_keys is deprecated"):
142+
getattr(adata, f"{name}_keys")()

tests/test_readwrite.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -494,18 +494,18 @@ def test_readwrite_loom(typ, obsm_mapping, varm_mapping, tmp_path):
494494
else:
495495
# TODO: this should not be necessary
496496
assert np.allclose(adata.X.toarray(), X.toarray())
497-
assert "X_a" in adata.obsm_keys()
497+
assert "X_a" in adata.obsm
498498
assert adata.obsm["X_a"].shape[1] == 2
499-
assert "X_b" in adata.varm_keys()
499+
assert "X_b" in adata.varm
500500
assert adata.varm["X_b"].shape[1] == 3
501501
# as we called with `cleanup=True`
502502
assert "oanno1b" in adata.uns["loom-obs"]
503503
assert "vanno2" in adata.uns["loom-var"]
504504
for k, v in obsm_mapping.items():
505-
assert k in adata.obsm_keys()
505+
assert k in adata.obsm
506506
assert adata.obsm[k].shape[1] == len(v)
507507
for k, v in varm_mapping.items():
508-
assert k in adata.varm_keys()
508+
assert k in adata.varm
509509
assert adata.varm[k].shape[1] == len(v)
510510
assert adata.obs_names.name == obs_dim
511511
assert adata.var_names.name == var_dim

0 commit comments

Comments
 (0)