diff --git a/doc/whats-new.rst b/doc/whats-new.rst index 42da3fa8e63..eeb768224e6 100644 --- a/doc/whats-new.rst +++ b/doc/whats-new.rst @@ -18,6 +18,14 @@ What's New v0.13.1 (unreleased) -------------------- +Bug fixes +~~~~~~~~~ +- Reintroduce support for :mod:`weakref` (broken in v0.13.0). Support has been + reinstated for :class:`DataArray` and :class:`Dataset` objects only. Internal xarray + objects remain unaddressable by weakref in order to save memory. + (:issue:`3317`) by `Guido Imperiale `_. + + .. _whats-new.0.13.0: v0.13.0 (17 Sep 2019) diff --git a/xarray/core/dataarray.py b/xarray/core/dataarray.py index d9e98839419..13a3a507c7b 100644 --- a/xarray/core/dataarray.py +++ b/xarray/core/dataarray.py @@ -248,7 +248,15 @@ class DataArray(AbstractArray, DataWithCoords): Dictionary for holding arbitrary metadata. """ - __slots__ = ("_accessors", "_coords", "_file_obj", "_name", "_indexes", "_variable") + __slots__ = ( + "_accessors", + "_coords", + "_file_obj", + "_name", + "_indexes", + "_variable", + "__weakref__", + ) _groupby_cls = groupby.DataArrayGroupBy _rolling_cls = rolling.DataArrayRolling diff --git a/xarray/core/dataset.py b/xarray/core/dataset.py index 693e94e22dd..3ba1bd9e3d8 100644 --- a/xarray/core/dataset.py +++ b/xarray/core/dataset.py @@ -420,6 +420,7 @@ class Dataset(Mapping, ImplementsDatasetReduce, DataWithCoords): "_file_obj", "_indexes", "_variables", + "__weakref__", ) _groupby_cls = groupby.DatasetGroupBy diff --git a/xarray/tests/test_dataarray.py b/xarray/tests/test_dataarray.py index 01e92bdd7be..9ba3eecc5a0 100644 --- a/xarray/tests/test_dataarray.py +++ b/xarray/tests/test_dataarray.py @@ -4672,3 +4672,14 @@ class MyArray(DataArray): pass assert str(e.value) == "MyArray must explicitly define __slots__" + + +def test_weakref(): + """Classes with __slots__ are incompatible with the weakref module unless they + explicitly state __weakref__ among their slots + """ + from weakref import ref + + a = DataArray(1) + r = ref(a) + assert r() is a diff --git a/xarray/tests/test_dataset.py b/xarray/tests/test_dataset.py index 7d2b11d02c9..f02990a1be9 100644 --- a/xarray/tests/test_dataset.py +++ b/xarray/tests/test_dataset.py @@ -5786,3 +5786,14 @@ class MyDS(Dataset): pass assert str(e.value) == "MyDS must explicitly define __slots__" + + +def test_weakref(): + """Classes with __slots__ are incompatible with the weakref module unless they + explicitly state __weakref__ among their slots + """ + from weakref import ref + + ds = Dataset() + r = ref(ds) + assert r() is ds