| 
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