diff --git a/doc/whats-new.rst b/doc/whats-new.rst index 3dad685aaf7..3845999f513 100644 --- a/doc/whats-new.rst +++ b/doc/whats-new.rst @@ -27,6 +27,11 @@ New Features Breaking changes ~~~~~~~~~~~~~~~~ +- The ``__repr__`` of a :py:class:`xarray.Dataset`'s ``coords`` and ``data_vars`` + ignore ``xarray.set_option(display_max_rows=...)`` and show the full output + when called directly as, e.g., ``ds.data_vars`` or ``print(ds.data_vars)`` + (:issue:`5545`, :pull:`5580`). + By `Stefan Bender `_. Deprecations ~~~~~~~~~~~~ diff --git a/xarray/core/formatting.py b/xarray/core/formatting.py index 7f292605e63..70d1a61f56c 100644 --- a/xarray/core/formatting.py +++ b/xarray/core/formatting.py @@ -377,14 +377,12 @@ def _mapping_repr( ): if col_width is None: col_width = _calculate_col_width(mapping) - if max_rows is None: - max_rows = OPTIONS["display_max_rows"] summary = [f"{title}:"] if mapping: len_mapping = len(mapping) if not _get_boolean_with_default(expand_option_name, default=True): summary = [f"{summary[0]} ({len_mapping})"] - elif len_mapping > max_rows: + elif max_rows is not None and len_mapping > max_rows: summary = [f"{summary[0]} ({max_rows}/{len_mapping})"] first_rows = max_rows // 2 + max_rows % 2 keys = list(mapping.keys()) @@ -418,7 +416,7 @@ def _mapping_repr( ) -def coords_repr(coords, col_width=None): +def coords_repr(coords, col_width=None, max_rows=None): if col_width is None: col_width = _calculate_col_width(_get_col_items(coords)) return _mapping_repr( @@ -427,6 +425,7 @@ def coords_repr(coords, col_width=None): summarizer=summarize_coord, expand_option_name="display_expand_coords", col_width=col_width, + max_rows=max_rows, ) @@ -544,21 +543,22 @@ def dataset_repr(ds): summary = ["".format(type(ds).__name__)] col_width = _calculate_col_width(_get_col_items(ds.variables)) + max_rows = OPTIONS["display_max_rows"] dims_start = pretty_print("Dimensions:", col_width) summary.append("{}({})".format(dims_start, dim_summary(ds))) if ds.coords: - summary.append(coords_repr(ds.coords, col_width=col_width)) + summary.append(coords_repr(ds.coords, col_width=col_width, max_rows=max_rows)) unindexed_dims_str = unindexed_dims_repr(ds.dims, ds.coords) if unindexed_dims_str: summary.append(unindexed_dims_str) - summary.append(data_vars_repr(ds.data_vars, col_width=col_width)) + summary.append(data_vars_repr(ds.data_vars, col_width=col_width, max_rows=max_rows)) if ds.attrs: - summary.append(attrs_repr(ds.attrs)) + summary.append(attrs_repr(ds.attrs, max_rows=max_rows)) return "\n".join(summary) diff --git a/xarray/tests/test_formatting.py b/xarray/tests/test_formatting.py index b9ba57f99dc..d5e7d2ee232 100644 --- a/xarray/tests/test_formatting.py +++ b/xarray/tests/test_formatting.py @@ -509,15 +509,16 @@ def test__mapping_repr(display_max_rows, n_vars, n_attr): long_name = "long_name" a = np.core.defchararray.add(long_name, np.arange(0, n_vars).astype(str)) b = np.core.defchararray.add("attr_", np.arange(0, n_attr).astype(str)) + c = np.core.defchararray.add("coord", np.arange(0, n_vars).astype(str)) attrs = {k: 2 for k in b} - coords = dict(time=np.array([0, 1])) + coords = {_c: np.array([0, 1]) for _c in c} data_vars = dict() - for v in a: + for (v, _c) in zip(a, coords.items()): data_vars[v] = xr.DataArray( name=v, data=np.array([3, 4]), - dims=["time"], - coords=coords, + dims=[_c[0]], + coords=dict([_c]), ) ds = xr.Dataset(data_vars) ds.attrs = attrs @@ -525,25 +526,37 @@ def test__mapping_repr(display_max_rows, n_vars, n_attr): with xr.set_options(display_max_rows=display_max_rows): # Parse the data_vars print and show only data_vars rows: - summary = formatting.data_vars_repr(ds.data_vars).split("\n") + summary = formatting.dataset_repr(ds).split("\n") summary = [v for v in summary if long_name in v] - # The length should be less than or equal to display_max_rows: len_summary = len(summary) data_vars_print_size = min(display_max_rows, len_summary) assert len_summary == data_vars_print_size + summary = formatting.data_vars_repr(ds.data_vars).split("\n") + summary = [v for v in summary if long_name in v] + # The length should be equal to the number of data variables + len_summary = len(summary) + assert len_summary == n_vars + + summary = formatting.coords_repr(ds.coords).split("\n") + summary = [v for v in summary if "coord" in v] + # The length should be equal to the number of data variables + len_summary = len(summary) + assert len_summary == n_vars + with xr.set_options( display_expand_coords=False, display_expand_data_vars=False, display_expand_attrs=False, ): actual = formatting.dataset_repr(ds) + coord_s = ", ".join([f"{c}: {len(v)}" for c, v in coords.items()]) expected = dedent( f"""\ - Dimensions: (time: 2) - Coordinates: (1) + Dimensions: ({coord_s}) + Coordinates: ({n_vars}) Data variables: ({n_vars}) Attributes: ({n_attr})""" )