id,node_id,number,title,user,state,locked,assignee,milestone,comments,created_at,updated_at,closed_at,author_association,active_lock_reason,draft,pull_request,body,reactions,performed_via_github_app,state_reason,repo,type 1379000408,I_kwDOAMm_X85SMeBY,7057,Hook for better control over copy behavior with duck-arrays?,12912489,open,0,,,0,2022-09-20T08:11:12Z,2022-09-20T08:12:22Z,,NONE,,,,"### Context By using `copy(deep=False)` custom operations may avoid copying large amounts of data but can modify, e.g., coord dicts: ```python tmp = da.copy(deep=False) del tmp.coords['abc'] # Use tmp ``` When `da` wraps a duck-array with substructure the current implementation is insufficient: ```python tmp = da.copy(deep=False) # Imagine a duck-array similar to numpy.ma but with a dict of masks del tmp.data.masks['abc'] # Bad: breaks `da` # Use tmp ``` ### Describe the solution you'd like Currently there does not appear a solution to this, unless we know details about the duck array. Therefore, I wonder if we need an additional ""hook"" that duck-arrays may provide, which could be called by Xarray to make a non-deep copy? ```python class MyDuckArray: def _copy_shallow_(self): # TODO: better name """"""Copy everything except buffers"""""" ``` ```python # in xarray.Variable def copy(self, deep=True): if deep: data = copy.deepcopy(data) elif hasattr(data, '_copy_shallow_'): data = data._copy_shallow_() ``` ### Additional context This is the current implementation for `Variable`. There is no operation for `deep=False`: https://github.com/pydata/xarray/blob/716973e41060184beebd64935afe196a805ef481/xarray/core/variable.py#L956-L957","{""url"": ""https://api.github.com/repos/pydata/xarray/issues/7057/reactions"", ""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,,13221727,issue