From 2e249a1aa694f1f5c76016be4894c1d1ca3b172c Mon Sep 17 00:00:00 2001 From: Deepak Cherian Date: Thu, 11 Jun 2026 23:20:24 -0600 Subject: [PATCH] Avoid DataArray construction when scanning for cell_measures cell_measures iterated obj.coords.values()/obj.data_vars.values() to read the cell_measures attribute, constructing (and resolving coordinates for) a DataArray per variable on every access. Read the attribute off the bare Variables instead, matching standard_names. Co-Authored-By: Claude Opus 4.8 (1M context) --- cf_xarray/accessor.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/cf_xarray/accessor.py b/cf_xarray/accessor.py index 2d828963..78610310 100644 --- a/cf_xarray/accessor.py +++ b/cf_xarray/accessor.py @@ -2107,17 +2107,14 @@ def cell_measures(self) -> dict[str, list[Hashable]]: """ obj = self._obj + if isinstance(obj, DataArray): + variables = [*obj.coords.variables.values(), obj.variable] + else: + variables = list(obj.variables.values()) all_attrs = [ - ChainMap(da.attrs, da.encoding).get("cell_measures", "") - for da in obj.coords.values() + ChainMap(var.attrs, var.encoding).get("cell_measures", "") + for var in variables ] - if isinstance(obj, DataArray): - all_attrs += [ChainMap(obj.attrs, obj.encoding).get("cell_measures", "")] - elif isinstance(obj, Dataset): - all_attrs += [ - ChainMap(da.attrs, da.encoding).get("cell_measures", "") - for da in obj.data_vars.values() - ] as_dataset = self._maybe_to_dataset().reset_coords() keys: dict[str, str] = {}