6
6
VT = typing .TypeVar ("VT" )
7
7
DT = typing .TypeVar ("DT" )
8
8
9
- _sential = object ()
10
9
11
-
12
- def _items_to_str (items , length , max_len = 50 ):
13
- if length <= max_len :
10
+ def _items_to_str (items , length ):
11
+ if length <= 50 :
14
12
return "{" + ", " .join (f"{ k } : { v } " for k , v in items ) + "}"
15
13
16
14
c = 0
17
15
left = []
18
- right = []
19
16
20
17
while c < length :
21
18
k , v = next (items )
22
19
23
- if c <= 20 :
20
+ if c <= 50 :
24
21
left .append (f"{ k } : { v } " )
25
22
26
- elif ( length - c ) <= 20 :
27
- right . append ( f" { k } : { v } " )
23
+ else :
24
+ break
28
25
29
26
c += 1
30
27
31
- return "{" + ", " . join ( left ) + " ... truncated ... " + ", " .join (right ) + "}"
28
+ return "{%s, ... %d more ...}" % ( ", " .join (left ), length - c )
32
29
33
30
34
31
class BaseCacheImpl (typing .Generic [KT , VT ]):
@@ -129,13 +126,19 @@ def insert(self, key: KT, value: VT) -> typing.Optional[VT]:
129
126
130
127
def get (self , key : KT , default : typing .Optional [DT ] = None ) -> typing .Union [VT , DT ]:
131
128
"""Equals to `self[key]`, but returns `default` if the cache don't have this key present."""
132
- return self ._raw .get (key , default )
129
+ try :
130
+ return self ._raw .get (key )
131
+ except _core .CoreKeyError :
132
+ return default
133
133
134
134
def pop (self , key : KT , default : typing .Optional [DT ] = None ) -> typing .Union [VT , DT ]:
135
135
"""
136
136
Removes specified key and return the corresponding value. If the key is not found, returns the `default`.
137
137
"""
138
- return self ._raw .pop (key , default )
138
+ try :
139
+ return self ._raw .remove (key )
140
+ except _core .CoreKeyError :
141
+ return default
139
142
140
143
def setdefault (self , key : KT , default : typing .Optional [DT ] = None ) -> typing .Union [VT , DT ]:
141
144
"""
@@ -165,22 +168,28 @@ def __setitem__(self, key: KT, value: VT) -> None:
165
168
self .insert (key , value )
166
169
167
170
def __getitem__ (self , key : KT ) -> VT :
168
- val = self ._raw .get (key , _sential )
169
- if val is _sential :
170
- raise KeyError (key )
171
-
172
- return val
171
+ try :
172
+ return self ._raw .get (key )
173
+ except _core .CoreKeyError :
174
+ raise KeyError (key ) from None
173
175
174
176
def __delitem__ (self , key : KT ) -> None :
175
- val = self ._raw .pop (key , _sential )
176
- if val is _sential :
177
- raise KeyError (key )
177
+ try :
178
+ self ._raw .remove (key )
179
+ except _core .CoreKeyError :
180
+ raise KeyError (key ) from None
178
181
179
182
def __eq__ (self , other ) -> bool :
180
- return self ._raw == other
183
+ if not isinstance (other , Cache ):
184
+ return False
185
+
186
+ return self ._raw == other ._raw
181
187
182
188
def __ne__ (self , other ) -> bool :
183
- return self ._raw != other
189
+ if not isinstance (other , Cache ):
190
+ return False
191
+
192
+ return self ._raw != other ._raw
184
193
185
194
def shrink_to_fit (self ) -> None :
186
195
"""Shrinks the cache to fit len(self) elements."""
@@ -278,16 +287,25 @@ def insert(self, key: KT, value: VT) -> typing.Optional[VT]:
278
287
return self ._raw .insert (key , value )
279
288
280
289
def get (self , key : KT , default : typing .Optional [DT ] = None ) -> typing .Union [VT , DT ]:
281
- return self ._raw .get (key , default )
290
+ try :
291
+ return self ._raw .get (key )
292
+ except _core .CoreKeyError :
293
+ return default
282
294
283
295
def pop (self , key : KT , default : typing .Optional [DT ] = None ) -> typing .Union [VT , DT ]:
284
- return self ._raw .pop (key , default )
296
+ try :
297
+ return self ._raw .remove (key )
298
+ except _core .CoreKeyError :
299
+ return default
285
300
286
301
def setdefault (self , key : KT , default : typing .Optional [DT ] = None ) -> typing .Union [VT , DT ]:
287
302
return self ._raw .setdefault (key , default )
288
303
289
304
def popitem (self ) -> typing .Tuple [KT , VT ]:
290
- return self ._raw .popitem ()
305
+ try :
306
+ return self ._raw .popitem ()
307
+ except _core .CoreKeyError :
308
+ raise KeyError () from None
291
309
292
310
def drain (self , n : int ) -> int :
293
311
if n == 0 :
@@ -296,7 +314,7 @@ def drain(self, n: int) -> int:
296
314
for i in range (n ):
297
315
try :
298
316
self ._raw .popitem ()
299
- except KeyError :
317
+ except _core . CoreKeyError :
300
318
return i
301
319
302
320
return i
@@ -311,22 +329,28 @@ def __setitem__(self, key: KT, value: VT) -> None:
311
329
self .insert (key , value )
312
330
313
331
def __getitem__ (self , key : KT ) -> VT :
314
- val = self ._raw .get (key , _sential )
315
- if val is _sential :
316
- raise KeyError (key )
317
-
318
- return val
332
+ try :
333
+ return self ._raw .get (key )
334
+ except _core .CoreKeyError :
335
+ raise KeyError (key ) from None
319
336
320
337
def __delitem__ (self , key : KT ) -> None :
321
- val = self ._raw .pop (key , _sential )
322
- if val is _sential :
323
- raise KeyError (key )
338
+ try :
339
+ self ._raw .remove (key )
340
+ except _core .CoreKeyError :
341
+ raise KeyError (key ) from None
324
342
325
343
def __eq__ (self , other ) -> bool :
326
- return self ._raw == other
344
+ if not isinstance (other , FIFOCache ):
345
+ return False
346
+
347
+ return self ._raw == other ._raw
327
348
328
349
def __ne__ (self , other ) -> bool :
329
- return self ._raw != other
350
+ if not isinstance (other , FIFOCache ):
351
+ return False
352
+
353
+ return self ._raw != other ._raw
330
354
331
355
def shrink_to_fit (self ) -> None :
332
356
self ._raw .shrink_to_fit ()
@@ -343,6 +367,18 @@ def keys(self) -> IteratorView[KT]:
343
367
def values (self ) -> IteratorView [VT ]:
344
368
return IteratorView (self ._raw .items (), lambda x : x [1 ])
345
369
370
+ def first (self , n : int = 0 ) -> typing .Optional [KT ]:
371
+ if n < 0 :
372
+ n = len (self ._raw ) + n
373
+
374
+ if n < 0 :
375
+ return None
376
+
377
+ return self ._raw .get_index (n )
378
+
379
+ def last (self ) -> typing .Optional [KT ]:
380
+ return self ._raw .get_index (len (self ._raw ) - 1 )
381
+
346
382
def __iter__ (self ) -> IteratorView [KT ]:
347
383
return self .keys ()
348
384
0 commit comments