Skip to content

Commit 75b49f9

Browse files
committed
Restore ability to specify _FillValue as Python native integers
1 parent 3013fb4 commit 75b49f9

File tree

2 files changed

+15
-5
lines changed

2 files changed

+15
-5
lines changed

xarray/coding/variables.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -520,9 +520,19 @@ def encode(self, variable: Variable, name: T_Name = None) -> Variable:
520520
# trying to get it from encoding, resort to an int with the same precision as data.dtype if not available
521521
signed_dtype = np.dtype(encoding.get("dtype", f"i{data.dtype.itemsize}"))
522522
if "_FillValue" in attrs:
523-
new_fill = np.array(attrs["_FillValue"])
524-
# use view here to prevent OverflowError
525-
attrs["_FillValue"] = new_fill.view(signed_dtype).item()
523+
try:
524+
# user provided the on-disk signed fill
525+
new_fill = signed_dtype.type(attrs["_FillValue"])
526+
except OverflowError:
527+
# user provided the in-memory unsigned fill, convert to signed type
528+
unsigned_dtype = np.dtype(f"u{signed_dtype.itemsize}")
529+
# use view here to prevent OverflowError
530+
new_fill = (
531+
np.array(attrs["_FillValue"], dtype=unsigned_dtype)
532+
.view(signed_dtype)
533+
.item()
534+
)
535+
attrs["_FillValue"] = new_fill
526536
data = duck_array_ops.astype(duck_array_ops.around(data), signed_dtype)
527537

528538
return Variable(dims, data, attrs, encoding, fastpath=True)

xarray/tests/test_backends.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ def create_encoded_masked_and_scaled_data(dtype: np.dtype) -> Dataset:
166166

167167
def create_unsigned_masked_scaled_data(dtype: np.dtype) -> Dataset:
168168
encoding = {
169-
"_FillValue": np.int8(-1),
169+
"_FillValue": 255,
170170
"_Unsigned": "true",
171171
"dtype": "i1",
172172
"add_offset": dtype.type(10),
@@ -925,7 +925,7 @@ def test_roundtrip_mask_and_scale(self, decoded_fn, encoded_fn, dtype) -> None:
925925
assert decoded.variables[k].dtype == actual.variables[k].dtype
926926
assert_allclose(decoded, actual, decode_bytes=False)
927927

928-
@pytest.mark.parametrize("fillvalue", [np.int8(-1), np.uint8(255)])
928+
@pytest.mark.parametrize("fillvalue", [np.int8(-1), np.uint8(255), -1, 255])
929929
def test_roundtrip_unsigned(self, fillvalue):
930930
# regression/numpy2 test for
931931
encoding = {

0 commit comments

Comments
 (0)