diff --git a/xarray/core/formatting.py b/xarray/core/formatting.py index ea0e6275fb6..11b60f3d1fe 100644 --- a/xarray/core/formatting.py +++ b/xarray/core/formatting.py @@ -357,7 +357,7 @@ def summarize_attr(key, value, col_width=None): def _calculate_col_width(col_items): - max_name_length = max(len(str(s)) for s in col_items) if col_items else 0 + max_name_length = max((len(str(s)) for s in col_items), default=0) col_width = max(max_name_length, 7) + 6 return col_width diff --git a/xarray/tests/test_formatting.py b/xarray/tests/test_formatting.py index 96bb9c8a3a7..181b0205352 100644 --- a/xarray/tests/test_formatting.py +++ b/xarray/tests/test_formatting.py @@ -773,3 +773,33 @@ def __array__(self, dtype=None): # These will crash if var.data are converted to numpy arrays: var.__repr__() var._repr_html_() + + +@pytest.mark.parametrize("as_dataset", (False, True)) +def test_format_xindexes_none(as_dataset: bool) -> None: + # ensure repr for empty xindexes can be displayed #8367 + + expected = """\ + Indexes: + *empty*""" + expected = dedent(expected) + + obj: xr.DataArray | xr.Dataset = xr.DataArray() + obj = obj._to_temp_dataset() if as_dataset else obj + + actual = repr(obj.xindexes) + assert actual == expected + + +@pytest.mark.parametrize("as_dataset", (False, True)) +def test_format_xindexes(as_dataset: bool) -> None: + expected = """\ + Indexes: + x PandasIndex""" + expected = dedent(expected) + + obj: xr.DataArray | xr.Dataset = xr.DataArray([1], coords={"x": [1]}) + obj = obj._to_temp_dataset() if as_dataset else obj + + actual = repr(obj.xindexes) + assert actual == expected