|
28 | 28 | from zarr.core.buffer import Buffer, BufferPrototype |
29 | 29 | from zarr.core.common import BytesLike |
30 | 30 |
|
| 31 | +ALLOWED_EXCEPTIONS: tuple[type[Exception], ...] = ( |
| 32 | + FileNotFoundError, |
| 33 | + IsADirectoryError, |
| 34 | + NotADirectoryError, |
| 35 | +) |
| 36 | + |
31 | 37 |
|
32 | 38 | class ObjectStore(Store): |
33 | 39 | """A Zarr store that uses obstore for fast read/write from AWS, GCP, and Azure. |
@@ -77,27 +83,30 @@ def __setstate__(self) -> None: |
77 | 83 |
|
78 | 84 | async def get( |
79 | 85 | self, key: str, prototype: BufferPrototype, byte_range: ByteRequest | None = None |
80 | | - ) -> Buffer: |
81 | | - if byte_range is None: |
82 | | - resp = await obs.get_async(self.store, key) |
83 | | - return prototype.buffer.from_bytes(await resp.bytes_async()) |
84 | | - elif isinstance(byte_range, RangeByteRequest): |
85 | | - resp = await obs.get_range_async( |
86 | | - self.store, key, start=byte_range.start, end=byte_range.end |
87 | | - ) |
88 | | - return prototype.buffer.from_bytes(memoryview(resp)) |
89 | | - elif isinstance(byte_range, OffsetByteRequest): |
90 | | - resp = await obs.get_async( |
91 | | - self.store, key, options={"range": {"offset": byte_range.offset}} |
92 | | - ) |
93 | | - return prototype.buffer.from_bytes(await resp.bytes_async()) |
94 | | - elif isinstance(byte_range, SuffixByteRequest): |
95 | | - resp = await obs.get_async( |
96 | | - self.store, key, options={"range": {"suffix": byte_range.suffix}} |
97 | | - ) |
98 | | - return prototype.buffer.from_bytes(await resp.bytes_async()) |
99 | | - else: |
100 | | - raise ValueError(f"Unexpected input to `get`: {byte_range}") |
| 86 | + ) -> Buffer | None: |
| 87 | + try: |
| 88 | + if byte_range is None: |
| 89 | + resp = await obs.get_async(self.store, key) |
| 90 | + return prototype.buffer.from_bytes(await resp.bytes_async()) |
| 91 | + elif isinstance(byte_range, RangeByteRequest): |
| 92 | + resp = await obs.get_range_async( |
| 93 | + self.store, key, start=byte_range.start, end=byte_range.end |
| 94 | + ) |
| 95 | + return prototype.buffer.from_bytes(memoryview(resp)) |
| 96 | + elif isinstance(byte_range, OffsetByteRequest): |
| 97 | + resp = await obs.get_async( |
| 98 | + self.store, key, options={"range": {"offset": byte_range.offset}} |
| 99 | + ) |
| 100 | + return prototype.buffer.from_bytes(await resp.bytes_async()) |
| 101 | + elif isinstance(byte_range, SuffixByteRequest): |
| 102 | + resp = await obs.get_async( |
| 103 | + self.store, key, options={"range": {"suffix": byte_range.suffix}} |
| 104 | + ) |
| 105 | + return prototype.buffer.from_bytes(await resp.bytes_async()) |
| 106 | + else: |
| 107 | + raise ValueError(f"Unexpected input to `get`: {byte_range}") |
| 108 | + except ALLOWED_EXCEPTIONS: |
| 109 | + return None |
101 | 110 |
|
102 | 111 | async def get_partial_values( |
103 | 112 | self, |
|
0 commit comments