From e13b586d9ff075124345cd5a6a07daf5efed0196 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kai=20M=C3=BChlbauer?= Date: Mon, 25 Mar 2024 15:25:40 +0100 Subject: [PATCH] merge maybe_decode_bytes function into _read_attributes, add attribute and variable name to warning --- xarray/backends/h5netcdf_.py | 23 ++++++++++------------- xarray/tests/test_backends.py | 3 ++- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/xarray/backends/h5netcdf_.py b/xarray/backends/h5netcdf_.py index 32610b5886f..81ba37f6707 100644 --- a/xarray/backends/h5netcdf_.py +++ b/xarray/backends/h5netcdf_.py @@ -59,18 +59,6 @@ def _getitem(self, key): return array[key] -def maybe_decode_bytes(txt): - if isinstance(txt, bytes): - try: - return txt.decode("utf-8") - except UnicodeDecodeError: - emit_user_level_warning( - "'utf-8' codec can't decode bytes, " "returning bytes undecoded.", - UnicodeWarning, - ) - return txt - - def _read_attributes(h5netcdf_var): # GH451 # to ensure conventions decoding works properly on Python 3, decode all @@ -78,7 +66,16 @@ def _read_attributes(h5netcdf_var): attrs = {} for k, v in h5netcdf_var.attrs.items(): if k not in ["_FillValue", "missing_value"]: - v = maybe_decode_bytes(v) + if isinstance(v, bytes): + try: + v = v.decode("utf-8") + except UnicodeDecodeError: + emit_user_level_warning( + f"'utf-8' codec can't decode bytes for attribute " + f"{k!r} of h5netcdf object {h5netcdf_var.name!r}, " + f"returning bytes undecoded.", + UnicodeWarning, + ) attrs[k] = v return attrs diff --git a/xarray/tests/test_backends.py b/xarray/tests/test_backends.py index 6f89d2e673b..1d69b3adc63 100644 --- a/xarray/tests/test_backends.py +++ b/xarray/tests/test_backends.py @@ -3565,9 +3565,10 @@ def test_decode_utf8_warning(self) -> None: with create_tmp_file() as tmp_file: with nc4.Dataset(tmp_file, "w") as f: f.title = title - with pytest.warns(UnicodeWarning, match="returning bytes undecoded"): + with pytest.warns(UnicodeWarning, match="returning bytes undecoded") as w: ds = xr.load_dataset(tmp_file, engine="h5netcdf") assert ds.title == title + assert "attribute 'title' of h5netcdf object '/'" in str(w[0].message) @requires_h5netcdf