Skip to content

Commit a7d35f8

Browse files
committed
Use match; case instead of if; elif
1 parent fff58dc commit a7d35f8

File tree

4 files changed

+70
-67
lines changed

4 files changed

+70
-67
lines changed

src/zarr/storage/_fsspec.py

Lines changed: 35 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -213,26 +213,27 @@ async def get(
213213
path = _dereference_path(self.path, key)
214214

215215
try:
216-
if byte_range is None:
217-
value = prototype.buffer.from_bytes(await self.fs._cat_file(path))
218-
elif isinstance(byte_range, ExplicitByteRequest):
219-
value = prototype.buffer.from_bytes(
220-
await self.fs._cat_file(
221-
path,
222-
start=byte_range.start,
223-
end=byte_range.end,
216+
match byte_range:
217+
case None:
218+
value = prototype.buffer.from_bytes(await self.fs._cat_file(path))
219+
case ExplicitByteRequest(start, end):
220+
value = prototype.buffer.from_bytes(
221+
await self.fs._cat_file(
222+
path,
223+
start=start,
224+
end=end,
225+
)
224226
)
225-
)
226-
elif isinstance(byte_range, OffsetByteRequest):
227-
value = prototype.buffer.from_bytes(
228-
await self.fs._cat_file(path, start=byte_range.offset, end=None)
229-
)
230-
elif isinstance(byte_range, SuffixByteRequest):
231-
value = prototype.buffer.from_bytes(
232-
await self.fs._cat_file(path, start=-byte_range.suffix, end=None)
233-
)
234-
else:
235-
raise ValueError("Invalid format for ByteRangeRequest")
227+
case OffsetByteRequest(offset):
228+
value = prototype.buffer.from_bytes(
229+
await self.fs._cat_file(path, start=offset, end=None)
230+
)
231+
case SuffixByteRequest(suffix):
232+
value = prototype.buffer.from_bytes(
233+
await self.fs._cat_file(path, start=-suffix, end=None)
234+
)
235+
case _:
236+
raise ValueError(f"Unexpected byte_range, got {byte_range}.")
236237
except self.allowed_exceptions:
237238
return None
238239
except OSError as e:
@@ -290,20 +291,21 @@ async def get_partial_values(
290291
stops: list[int | None] = []
291292
for key, byte_range in key_ranges:
292293
paths.append(_dereference_path(self.path, key))
293-
if byte_range is None:
294-
starts.append(None)
295-
stops.append(None)
296-
elif isinstance(byte_range, ExplicitByteRequest):
297-
starts.append(byte_range.start)
298-
stops.append(byte_range.end)
299-
elif isinstance(byte_range, OffsetByteRequest):
300-
starts.append(byte_range.offset)
301-
stops.append(None)
302-
elif isinstance(byte_range, SuffixByteRequest):
303-
starts.append(-byte_range.suffix)
304-
stops.append(None)
305-
else:
306-
raise ValueError("Invalid format for ByteRangeRequest")
294+
match byte_range:
295+
case None:
296+
starts.append(None)
297+
stops.append(None)
298+
case ExplicitByteRequest(start, end):
299+
starts.append(start)
300+
stops.append(end)
301+
case OffsetByteRequest(offset):
302+
starts.append(offset)
303+
stops.append(None)
304+
case SuffixByteRequest(suffix):
305+
starts.append(-suffix)
306+
stops.append(None)
307+
case _:
308+
raise ValueError(f"Unexpected byte_range, got {byte_range}.")
307309
else:
308310
return []
309311
# TODO: expectations for exceptions or missing keys?

src/zarr/storage/_local.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,16 @@ def _get(path: Path, prototype: BufferPrototype, byte_range: ByteRangeRequest |
2929
return prototype.buffer.from_bytes(path.read_bytes())
3030
with path.open("rb") as f:
3131
size = f.seek(0, io.SEEK_END)
32-
if isinstance(byte_range, ExplicitByteRequest):
33-
f.seek(byte_range.start)
34-
return prototype.buffer.from_bytes(f.read(byte_range.end - f.tell()))
35-
elif isinstance(byte_range, OffsetByteRequest):
36-
f.seek(byte_range.offset)
37-
elif isinstance(byte_range, SuffixByteRequest):
38-
f.seek(max(0, size - byte_range.suffix))
39-
else:
40-
raise TypeError("Invalid format for ByteRangeRequest")
32+
match byte_range:
33+
case ExplicitByteRequest(start, end):
34+
f.seek(start)
35+
return prototype.buffer.from_bytes(f.read(end - f.tell()))
36+
case OffsetByteRequest(offset):
37+
f.seek(offset)
38+
case SuffixByteRequest(suffix):
39+
f.seek(max(0, size - suffix))
40+
case _:
41+
raise ValueError(f"Unexpected byte_range, got {byte_range}.")
4142
return prototype.buffer.from_bytes(f.read())
4243

4344

src/zarr/storage/_utils.py

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -53,16 +53,14 @@ def _normalize_byte_range_index(
5353
"""
5454
Convert an ByteRangeRequest into an explicit start and stop
5555
"""
56-
if byte_range is None:
57-
start = 0
58-
stop = len(data) + 1
59-
elif isinstance(byte_range, ExplicitByteRequest):
60-
start = byte_range.start
61-
stop = byte_range.end
62-
elif isinstance(byte_range, OffsetByteRequest):
63-
start = byte_range.offset
64-
stop = len(data) + 1
65-
elif isinstance(byte_range, SuffixByteRequest):
66-
start = len(data) - byte_range.suffix
67-
stop = len(data) + 1
68-
return (start, stop)
56+
match byte_range:
57+
case None:
58+
return (0, len(data) + 1)
59+
case ExplicitByteRequest(start, end):
60+
return (start, end)
61+
case OffsetByteRequest(offset):
62+
return (offset, len(data) + 1)
63+
case SuffixByteRequest(suffix):
64+
return (len(data) - suffix, len(data) + 1)
65+
case _:
66+
raise ValueError(f"Unexpected byte_range, got {byte_range}.")

src/zarr/storage/_zip.py

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -149,18 +149,20 @@ def _get(
149149
# docstring inherited
150150
try:
151151
with self._zf.open(key) as f: # will raise KeyError
152-
if byte_range is None:
153-
return prototype.buffer.from_bytes(f.read())
154-
elif isinstance(byte_range, ExplicitByteRequest):
155-
f.seek(byte_range.start)
156-
return prototype.buffer.from_bytes(f.read(byte_range.end - f.tell()))
157-
size = f.seek(0, os.SEEK_END)
158-
if isinstance(byte_range, OffsetByteRequest):
159-
f.seek(byte_range.offset)
160-
elif isinstance(byte_range, SuffixByteRequest):
161-
f.seek(max(0, size - byte_range.suffix))
162-
else:
163-
raise TypeError("Invalid format for ByteRangeRequest")
152+
match byte_range:
153+
case None:
154+
return prototype.buffer.from_bytes(f.read())
155+
case ExplicitByteRequest(start, end):
156+
f.seek(start)
157+
return prototype.buffer.from_bytes(f.read(end - f.tell()))
158+
case OffsetByteRequest(offset):
159+
size = f.seek(0, os.SEEK_END)
160+
f.seek(offset)
161+
case SuffixByteRequest(suffix):
162+
size = f.seek(0, os.SEEK_END)
163+
f.seek(max(0, size - suffix))
164+
case _:
165+
raise TypeError(f"Unexpected byte_range, got {byte_range}.")
164166
return prototype.buffer.from_bytes(f.read())
165167
except KeyError:
166168
return None

0 commit comments

Comments
 (0)