From 3f0c62ef5b46afef70d363ae6ae7c3cf28ee5fcb Mon Sep 17 00:00:00 2001 From: Mathias Hauser Date: Wed, 8 May 2019 10:54:38 +0200 Subject: [PATCH 1/7] merge add errormsg iterable --- xarray/core/merge.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/xarray/core/merge.py b/xarray/core/merge.py index 421ac39ebd8..279fe1cfb5a 100644 --- a/xarray/core/merge.py +++ b/xarray/core/merge.py @@ -533,9 +533,15 @@ def merge(objects, compat='no_conflicts', join='outer', fill_value=dtypes.NA): from .dataarray import DataArray from .dataset import Dataset - dict_like_objects = [ - obj.to_dataset() if isinstance(obj, DataArray) else obj - for obj in objects] + dict_like_objects = list() + for obj in objects: + obj = obj.to_dataset() if isinstance(obj, DataArray) else obj + + if not (isinstance(obj, Dataset) or isinstance(obj, dict)): + raise ValueError("'objects' must be an iterable containing " + "Dataset(s), DataArray(s), or dictionaries.") + + dict_like_objects.append(obj) variables, coord_names, dims = merge_core(dict_like_objects, compat, join, fill_value=fill_value) From 6fa03090110de453df2647710e4804229b34e815 Mon Sep 17 00:00:00 2001 From: Mathias Hauser Date: Fri, 17 May 2019 17:07:28 +0200 Subject: [PATCH 2/7] double_errormsg --- xarray/core/merge.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/xarray/core/merge.py b/xarray/core/merge.py index 279fe1cfb5a..1ba0325529c 100644 --- a/xarray/core/merge.py +++ b/xarray/core/merge.py @@ -533,14 +533,20 @@ def merge(objects, compat='no_conflicts', join='outer', fill_value=dtypes.NA): from .dataarray import DataArray from .dataset import Dataset + if isinstance(objects, (DataArray, Dataset, dict)): + raise ValueError("'objects' must be an iterable containing " + "Dataset(s), DataArray(s), or dictionaries.") + dict_like_objects = list() for obj in objects: - obj = obj.to_dataset() if isinstance(obj, DataArray) else obj - if not (isinstance(obj, Dataset) or isinstance(obj, dict)): + if not (isinstance(obj, (DataArray, Dataset, dict))): raise ValueError("'objects' must be an iterable containing " "Dataset(s), DataArray(s), or dictionaries.") + obj = obj.to_dataset() if isinstance(obj, DataArray) else obj + + dict_like_objects.append(obj) variables, coord_names, dims = merge_core(dict_like_objects, compat, join, From 68c25ac285e396fc21fa02627dd3053b293e5855 Mon Sep 17 00:00:00 2001 From: Mathias Hauser Date: Fri, 17 May 2019 19:05:34 +0200 Subject: [PATCH 3/7] only error in loop --- xarray/core/merge.py | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/xarray/core/merge.py b/xarray/core/merge.py index 1ba0325529c..8d57429c764 100644 --- a/xarray/core/merge.py +++ b/xarray/core/merge.py @@ -533,21 +533,14 @@ def merge(objects, compat='no_conflicts', join='outer', fill_value=dtypes.NA): from .dataarray import DataArray from .dataset import Dataset - if isinstance(objects, (DataArray, Dataset, dict)): - raise ValueError("'objects' must be an iterable containing " - "Dataset(s), DataArray(s), or dictionaries.") - dict_like_objects = list() for obj in objects: - if not (isinstance(obj, (DataArray, Dataset, dict))): - raise ValueError("'objects' must be an iterable containing " - "Dataset(s), DataArray(s), or dictionaries.") + raise ValueError("'objects' must be an iterable containing only " + "Dataset(s), DataArray(s), and dictionaries.") obj = obj.to_dataset() if isinstance(obj, DataArray) else obj - - - dict_like_objects.append(obj) + dict_like_objects.append(obj) variables, coord_names, dims = merge_core(dict_like_objects, compat, join, fill_value=fill_value) From 61a0397796082d797e90691e2e32f05eecd4befd Mon Sep 17 00:00:00 2001 From: Mathias Hauser Date: Fri, 17 May 2019 19:05:47 +0200 Subject: [PATCH 4/7] add test --- xarray/tests/test_merge.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/xarray/tests/test_merge.py b/xarray/tests/test_merge.py index 0d76db1d1ee..a8d46298ae9 100644 --- a/xarray/tests/test_merge.py +++ b/xarray/tests/test_merge.py @@ -67,6 +67,15 @@ def test_merge_alignment_error(self): with raises_regex(ValueError, 'indexes .* not equal'): xr.merge([ds, other], join='exact') + def test_merge_wrong_input_error(self): + with raises_regex(ValueError, "'objects' must be an iterable"): + xr.merge([1]) + ds = xr.Dataset(coords={'x': [1, 2]}) + with raises_regex(ValueError, "'objects' must be an iterable"): + xr.merge({'a': ds}) + with raises_regex(ValueError, "'objects' must be an iterable"): + xr.merge([ds, 1]) + def test_merge_no_conflicts_single_var(self): ds1 = xr.Dataset({'a': ('x', [1, 2]), 'x': [0, 1]}) ds2 = xr.Dataset({'a': ('x', [2, 3]), 'x': [1, 2]}) From e5d0f3797bd5f952e4da9aec383d50c749189ca0 Mon Sep 17 00:00:00 2001 From: Mathias Hauser Date: Fri, 17 May 2019 19:14:00 +0200 Subject: [PATCH 5/7] update whats-new --- doc/whats-new.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/whats-new.rst b/doc/whats-new.rst index dfdca55d218..358819c7e78 100644 --- a/doc/whats-new.rst +++ b/doc/whats-new.rst @@ -42,6 +42,8 @@ Enhancements helpful for avoiding file-lock errors when trying to write to files opened using ``open_dataset()`` or ``open_dataarray()``. (:issue:`2887`) By `Dan Nowacki `_. +- Better warning message when supplying invalid objects to ``xr.merge`` + (:issue:`2948`). By `Mathias Hauser `_. Bug fixes ~~~~~~~~~ From 906127c2516f1187b1750ca8f70cd95386aafa99 Mon Sep 17 00:00:00 2001 From: Mathias Hauser Date: Mon, 27 May 2019 16:34:05 +0200 Subject: [PATCH 6/7] ValueError -> TypeError --- xarray/core/merge.py | 2 +- xarray/tests/test_merge.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/xarray/core/merge.py b/xarray/core/merge.py index 8d57429c764..86d6b3e46b2 100644 --- a/xarray/core/merge.py +++ b/xarray/core/merge.py @@ -536,7 +536,7 @@ def merge(objects, compat='no_conflicts', join='outer', fill_value=dtypes.NA): dict_like_objects = list() for obj in objects: if not (isinstance(obj, (DataArray, Dataset, dict))): - raise ValueError("'objects' must be an iterable containing only " + raise TypeError("objects must be an iterable containing only " "Dataset(s), DataArray(s), and dictionaries.") obj = obj.to_dataset() if isinstance(obj, DataArray) else obj diff --git a/xarray/tests/test_merge.py b/xarray/tests/test_merge.py index a8d46298ae9..10851f28b6b 100644 --- a/xarray/tests/test_merge.py +++ b/xarray/tests/test_merge.py @@ -68,12 +68,12 @@ def test_merge_alignment_error(self): xr.merge([ds, other], join='exact') def test_merge_wrong_input_error(self): - with raises_regex(ValueError, "'objects' must be an iterable"): + with raises_regex(TypeError, "objects must be an iterable"): xr.merge([1]) ds = xr.Dataset(coords={'x': [1, 2]}) - with raises_regex(ValueError, "'objects' must be an iterable"): + with raises_regex(TypeError, "objects must be an iterable"): xr.merge({'a': ds}) - with raises_regex(ValueError, "'objects' must be an iterable"): + with raises_regex(TypeError, "objects must be an iterable"): xr.merge([ds, 1]) def test_merge_no_conflicts_single_var(self): From c8d754321863b9da83618c54b9ea3b5e6723026b Mon Sep 17 00:00:00 2001 From: Mathias Hauser Date: Mon, 27 May 2019 16:42:06 +0200 Subject: [PATCH 7/7] pep8 --- xarray/core/merge.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xarray/core/merge.py b/xarray/core/merge.py index 86d6b3e46b2..c2c6aee7c22 100644 --- a/xarray/core/merge.py +++ b/xarray/core/merge.py @@ -537,7 +537,7 @@ def merge(objects, compat='no_conflicts', join='outer', fill_value=dtypes.NA): for obj in objects: if not (isinstance(obj, (DataArray, Dataset, dict))): raise TypeError("objects must be an iterable containing only " - "Dataset(s), DataArray(s), and dictionaries.") + "Dataset(s), DataArray(s), and dictionaries.") obj = obj.to_dataset() if isinstance(obj, DataArray) else obj dict_like_objects.append(obj)