def test_encode_fill_value(fill_value, dtype, object_codec, result): # normalize metadata (copied from _init_array_metadata) dtype, object_codec = normalize_dtype(dtype, object_codec) dtype = dtype.base fill_value = normalize_fill_value(fill_value, dtype) # test if result: encode_fill_value(fill_value, dtype, object_codec) else: with pytest.raises(ValueError): encode_fill_value(fill_value, dtype, object_codec)
def transfer_attrs(self, h5obj, zobj): """Transfer attributes from an HDF5 object to its equivalent Zarr object. Parameters ---------- h5obj : h5py.Group or h5py.Dataset An HDF5 group or dataset. zobj : zarr.hierarchy.Group or zarr.core.Array An equivalent Zarr group or array to the HDF5 group or dataset with attributes. """ for n, v in h5obj.attrs.items(): if n in ('REFERENCE_LIST', 'DIMENSION_LIST'): continue # Fix some attribute values to avoid JSON encoding exceptions... if isinstance(v, bytes): v = v.decode('utf-8') elif isinstance(v, (np.ndarray, np.number)): if n == '_FillValue': v = encode_fill_value(v, v.dtype) elif v.size == 1: v = v.flatten()[0].tolist() else: v = v.tolist() if self._xr and v == 'DIMENSION_SCALE': continue try: zobj.attrs[n] = v except TypeError: print(f'Caught TypeError: {n}@{h5obj.name} = {v} ({type(v)})')
def _transfer_attrs(self, h5obj: Union[h5py.Dataset, h5py.Group], zobj: Union[zarr.Array, zarr.Group]): """Transfer attributes from an HDF5 object to its equivalent Zarr object. Parameters ---------- h5obj : h5py.Group or h5py.Dataset An HDF5 group or dataset. zobj : zarr.hierarchy.Group or zarr.core.Array An equivalent Zarr group or array to the HDF5 group or dataset with attributes. """ for n, v in h5obj.attrs.items(): if n in _HIDDEN_ATTRS: continue # Fix some attribute values to avoid JSON encoding exceptions... if isinstance(v, bytes): v = v.decode('utf-8') elif isinstance(v, (np.ndarray, np.number, np.bool_)): if v.dtype.kind == 'S': v = v.astype(str) if n == '_FillValue': v = encode_fill_value(v, v.dtype) elif v.size == 1: v = v.flatten()[0] if isinstance(v, (np.ndarray, np.number, np.bool_)): v = v.tolist() else: v = v.tolist() elif isinstance(v, h5py._hl.base.Empty): v = "" if v == 'DIMENSION_SCALE': continue try: zobj.attrs[n] = v except TypeError: lggr.exception( f'Caught TypeError: {n}@{h5obj.name} = {v} ({type(v)})')
def _extract_fill_value(da, dtype): """ helper function to extract fill value from DataArray. """ fill_value = da.attrs.pop('_FillValue', None) return encode_fill_value(fill_value, dtype)