Skip to content
5 changes: 5 additions & 0 deletions doc/whats-new.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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 <https://github.com/st-bender>`_.

Deprecations
~~~~~~~~~~~~
Expand Down
14 changes: 7 additions & 7 deletions xarray/core/formatting.py
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand Down Expand Up @@ -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(
Expand All @@ -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,
)


Expand Down Expand Up @@ -544,21 +543,22 @@ def dataset_repr(ds):
summary = ["<xarray.{}>".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)

Expand Down
29 changes: 21 additions & 8 deletions xarray/tests/test_formatting.py
Original file line number Diff line number Diff line change
Expand Up @@ -509,41 +509,54 @@ 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

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"""\
<xarray.Dataset>
Dimensions: (time: 2)
Coordinates: (1)
Dimensions: ({coord_s})
Coordinates: ({n_vars})
Data variables: ({n_vars})
Attributes: ({n_attr})"""
)
Expand Down