Skip to content

Commit 68bda36

Browse files
TomNicholasshoyer
authored andcommitted
Implement DataTree.__delitem__ (pydata#9453)
* test * improve error message * implement delitem * test KeyError * Remove special KeyError message Co-authored-by: Stephan Hoyer <[email protected]> * remove another special KeyError message Co-authored-by: Stephan Hoyer <[email protected]> * fix pytest raises expected error message --------- Co-authored-by: Stephan Hoyer <[email protected]>
1 parent dd7a9a5 commit 68bda36

File tree

3 files changed

+54
-3
lines changed

3 files changed

+54
-3
lines changed

xarray/core/datatree.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -910,6 +910,24 @@ def __setitem__(
910910
else:
911911
raise ValueError("Invalid format for key")
912912

913+
def __delitem__(self, key: str) -> None:
914+
"""Remove a variable or child node from this datatree node."""
915+
if key in self.children:
916+
super().__delitem__(key)
917+
918+
elif key in self._node_coord_variables:
919+
if key in self._node_indexes:
920+
del self._node_indexes[key]
921+
del self._node_coord_variables[key]
922+
self._node_dims = calculate_dimensions(self.variables)
923+
924+
elif key in self._data_variables:
925+
del self._data_variables[key]
926+
self._node_dims = calculate_dimensions(self.variables)
927+
928+
else:
929+
raise KeyError(key)
930+
913931
@overload
914932
def update(self, other: Dataset) -> None: ...
915933

xarray/core/treenode.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -559,14 +559,14 @@ def _set_item(
559559
else:
560560
current_node._set(name, item)
561561

562-
def __delitem__(self: Tree, key: str):
562+
def __delitem__(self: Tree, key: str) -> None:
563563
"""Remove a child node from this tree object."""
564564
if key in self.children:
565565
child = self._children[key]
566566
del self._children[key]
567567
child.orphan()
568568
else:
569-
raise KeyError("Cannot delete")
569+
raise KeyError(key)
570570

571571
def same_tree(self, other: Tree) -> bool:
572572
"""True if other node is in the same tree as this node."""

xarray/tests/test_datatree.py

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import pytest
88

99
import xarray as xr
10+
from xarray import Dataset
1011
from xarray.core.datatree import DataTree
1112
from xarray.core.datatree_ops import _MAPPED_DOCSTRING_ADDENDUM, insert_doc_addendum
1213
from xarray.core.treenode import NotFoundInTreeError
@@ -525,7 +526,39 @@ def test_setitem_dataarray_replace_existing_node(self):
525526
assert_identical(results.to_dataset(), expected)
526527

527528

528-
class TestDictionaryInterface: ...
529+
def test_delitem():
530+
ds = Dataset({"a": 0}, coords={"x": ("x", [1, 2]), "z": "a"})
531+
dt = DataTree(ds, children={"c": DataTree()})
532+
533+
with pytest.raises(KeyError):
534+
del dt["foo"]
535+
536+
# test delete children
537+
del dt["c"]
538+
assert dt.children == {}
539+
assert set(dt.variables) == {"x", "z", "a"}
540+
with pytest.raises(KeyError):
541+
del dt["c"]
542+
543+
# test delete variables
544+
del dt["a"]
545+
assert set(dt.coords) == {"x", "z"}
546+
with pytest.raises(KeyError):
547+
del dt["a"]
548+
549+
# test delete coordinates
550+
del dt["z"]
551+
assert set(dt.coords) == {"x"}
552+
with pytest.raises(KeyError):
553+
del dt["z"]
554+
555+
# test delete indexed coordinates
556+
del dt["x"]
557+
assert dt.variables == {}
558+
assert dt.coords == {}
559+
assert dt.indexes == {}
560+
with pytest.raises(KeyError):
561+
del dt["x"]
529562

530563

531564
class TestTreeFromDict:

0 commit comments

Comments
 (0)