6
6
7
7
8
8
class Cached :
9
+
10
+ class_cache = LRUCache (2 )
11
+ class_count = 0
12
+
9
13
def __init__ (self , cache , count = 0 ):
10
14
self .cache = cache
11
15
self .count = count
12
16
13
17
@cachedmethod (lambda self : self .cache )
14
18
def get (self , value ):
15
- count = self .count
16
19
self .count += 1
17
- return count
20
+ return self . count
18
21
19
22
@cachedmethod (lambda self : self .cache , key = keys .typedmethodkey )
20
23
def get_typedmethod (self , value ):
21
- count = self .count
22
24
self .count += 1
23
- return count
25
+ return self .count
26
+
27
+ @classmethod
28
+ @cachedmethod (lambda cls : cls .class_cache )
29
+ def get_classmethod (cls , value ):
30
+ cls .class_count += 1
31
+ return cls .class_count
32
+
33
+ @classmethod
34
+ @cachedmethod (lambda cls : cls .class_cache , key = keys .typedmethodkey )
35
+ def get_typedclassmethod (cls , value ):
36
+ cls .class_count += 1
37
+ return cls .class_count
24
38
25
39
26
40
class Locked :
@@ -31,9 +45,8 @@ def __init__(self, cache):
31
45
32
46
@cachedmethod (lambda self : self .cache , lock = lambda self : self )
33
47
def get (self , value ):
34
- count = self .count
35
48
self .count += 1
36
- return count
49
+ return self . count
37
50
38
51
def __enter__ (self ):
39
52
self .lock_count += 1
@@ -86,69 +99,69 @@ class CachedMethodTest(unittest.TestCase):
86
99
def test_dict (self ):
87
100
cached = Cached ({})
88
101
89
- self .assertEqual (cached .get (0 ), 0 )
90
- self .assertEqual (cached .get (1 ), 1 )
91
- self .assertEqual (cached .get (1 ), 1 )
92
- self .assertEqual (cached .get (1.0 ), 1 )
93
- self .assertEqual (cached .get (1.0 ), 1 )
102
+ self .assertEqual (cached .get (0 ), 1 )
103
+ self .assertEqual (cached .get (1 ), 2 )
104
+ self .assertEqual (cached .get (1 ), 2 )
105
+ self .assertEqual (cached .get (1.0 ), 2 )
106
+ self .assertEqual (cached .get (1.0 ), 2 )
94
107
95
108
cached .cache .clear ()
96
- self .assertEqual (cached .get (1 ), 2 )
109
+ self .assertEqual (cached .get (1 ), 3 )
97
110
98
111
def test_typedmethod_dict (self ):
99
112
cached = Cached (LRUCache (maxsize = 2 ))
100
113
101
- self .assertEqual (cached .get_typedmethod (0 ), 0 )
102
- self .assertEqual (cached .get_typedmethod (1 ), 1 )
103
- self .assertEqual (cached .get_typedmethod (1 ), 1 )
104
- self .assertEqual (cached .get_typedmethod (1.0 ), 2 )
105
- self .assertEqual (cached .get_typedmethod (1.0 ), 2 )
106
- self .assertEqual (cached .get_typedmethod (0.0 ), 3 )
107
- self .assertEqual (cached .get_typedmethod (0 ), 4 )
114
+ self .assertEqual (cached .get_typedmethod (0 ), 1 )
115
+ self .assertEqual (cached .get_typedmethod (1 ), 2 )
116
+ self .assertEqual (cached .get_typedmethod (1 ), 2 )
117
+ self .assertEqual (cached .get_typedmethod (1.0 ), 3 )
118
+ self .assertEqual (cached .get_typedmethod (1.0 ), 3 )
119
+ self .assertEqual (cached .get_typedmethod (0.0 ), 4 )
120
+ self .assertEqual (cached .get_typedmethod (0 ), 5 )
108
121
109
122
def test_lru (self ):
110
123
cached = Cached (LRUCache (maxsize = 2 ))
111
124
112
- self .assertEqual (cached .get (0 ), 0 )
113
- self .assertEqual (cached .get (1 ), 1 )
114
- self .assertEqual (cached .get (1 ), 1 )
115
- self .assertEqual (cached .get (1.0 ), 1 )
116
- self .assertEqual (cached .get (1.0 ), 1 )
125
+ self .assertEqual (cached .get (0 ), 1 )
126
+ self .assertEqual (cached .get (1 ), 2 )
127
+ self .assertEqual (cached .get (1 ), 2 )
128
+ self .assertEqual (cached .get (1.0 ), 2 )
129
+ self .assertEqual (cached .get (1.0 ), 2 )
117
130
118
131
cached .cache .clear ()
119
- self .assertEqual (cached .get (1 ), 2 )
132
+ self .assertEqual (cached .get (1 ), 3 )
120
133
121
134
def test_typedmethod_lru (self ):
122
135
cached = Cached (LRUCache (maxsize = 2 ))
123
136
124
- self .assertEqual (cached .get_typedmethod (0 ), 0 )
125
- self .assertEqual (cached .get_typedmethod (1 ), 1 )
126
- self .assertEqual (cached .get_typedmethod (1 ), 1 )
127
- self .assertEqual (cached .get_typedmethod (1.0 ), 2 )
128
- self .assertEqual (cached .get_typedmethod (1.0 ), 2 )
129
- self .assertEqual (cached .get_typedmethod (0.0 ), 3 )
130
- self .assertEqual (cached .get_typedmethod (0 ), 4 )
137
+ self .assertEqual (cached .get_typedmethod (0 ), 1 )
138
+ self .assertEqual (cached .get_typedmethod (1 ), 2 )
139
+ self .assertEqual (cached .get_typedmethod (1 ), 2 )
140
+ self .assertEqual (cached .get_typedmethod (1.0 ), 3 )
141
+ self .assertEqual (cached .get_typedmethod (1.0 ), 3 )
142
+ self .assertEqual (cached .get_typedmethod (0.0 ), 4 )
143
+ self .assertEqual (cached .get_typedmethod (0 ), 5 )
131
144
132
145
def test_nospace (self ):
133
146
cached = Cached (LRUCache (maxsize = 0 ))
134
147
135
- self .assertEqual (cached .get (0 ), 0 )
136
- self .assertEqual (cached .get (1 ), 1 )
148
+ self .assertEqual (cached .get (0 ), 1 )
137
149
self .assertEqual (cached .get (1 ), 2 )
138
- self .assertEqual (cached .get (1.0 ), 3 )
150
+ self .assertEqual (cached .get (1 ), 3 )
139
151
self .assertEqual (cached .get (1.0 ), 4 )
152
+ self .assertEqual (cached .get (1.0 ), 5 )
140
153
141
154
def test_nocache (self ):
142
155
cached = Cached (None )
143
156
144
157
with warnings .catch_warnings (record = True ) as w :
145
158
warnings .simplefilter ("always" )
146
159
147
- self .assertEqual (cached .get (0 ), 0 )
148
- self .assertEqual (cached .get (1 ), 1 )
160
+ self .assertEqual (cached .get (0 ), 1 )
149
161
self .assertEqual (cached .get (1 ), 2 )
150
- self .assertEqual (cached .get (1.0 ), 3 )
162
+ self .assertEqual (cached .get (1 ), 3 )
151
163
self .assertEqual (cached .get (1.0 ), 4 )
164
+ self .assertEqual (cached .get (1.0 ), 5 )
152
165
153
166
self .assertEqual (len (w ), 5 )
154
167
self .assertIs (w [0 ].category , DeprecationWarning )
@@ -166,7 +179,7 @@ def __add__(self, other):
166
179
167
180
cached = Cached (weakref .WeakValueDictionary (), count = Int (0 ))
168
181
169
- self .assertEqual (cached .get (0 ), 0 )
182
+ self .assertEqual (cached .get (0 ), 1 )
170
183
gc .collect ()
171
184
self .assertEqual (cached .get (0 ), 1 )
172
185
@@ -175,44 +188,44 @@ def __add__(self, other):
175
188
self .assertEqual (cached .get (1 ), 2 )
176
189
self .assertEqual (cached .get (1.0 ), 2 )
177
190
178
- ref = cached .get_typedmethod (1 )
191
+ ref = cached .get_typedmethod (2 )
179
192
self .assertEqual (ref , 3 )
180
- self .assertEqual (cached .get_typedmethod (1 ), 3 )
181
- self .assertEqual (cached .get_typedmethod (1.0 ), 4 )
193
+ self .assertEqual (cached .get_typedmethod (1 ), 4 )
194
+ self .assertEqual (cached .get_typedmethod (1.0 ), 5 )
182
195
183
196
cached .cache .clear ()
184
- self .assertEqual (cached .get (1 ), 5 )
197
+ self .assertEqual (cached .get (1 ), 6 )
185
198
186
199
def test_locked_dict (self ):
187
200
cached = Locked ({})
188
201
189
- self .assertEqual (cached .get (0 ), 0 )
202
+ self .assertEqual (cached .get (0 ), 1 )
190
203
self .assertEqual (cached .lock_count , 2 )
191
- self .assertEqual (cached .get (1 ), 1 )
204
+ self .assertEqual (cached .get (1 ), 2 )
192
205
self .assertEqual (cached .lock_count , 4 )
193
- self .assertEqual (cached .get (1 ), 1 )
206
+ self .assertEqual (cached .get (1 ), 2 )
194
207
self .assertEqual (cached .lock_count , 5 )
195
- self .assertEqual (cached .get (1.0 ), 1 )
208
+ self .assertEqual (cached .get (1.0 ), 2 )
196
209
self .assertEqual (cached .lock_count , 6 )
197
- self .assertEqual (cached .get (1.0 ), 1 )
210
+ self .assertEqual (cached .get (1.0 ), 2 )
198
211
self .assertEqual (cached .lock_count , 7 )
199
212
200
213
cached .cache .clear ()
201
- self .assertEqual (cached .get (1 ), 2 )
214
+ self .assertEqual (cached .get (1 ), 3 )
202
215
self .assertEqual (cached .lock_count , 9 )
203
216
204
217
def test_locked_nospace (self ):
205
218
cached = Locked (LRUCache (maxsize = 0 ))
206
219
207
- self .assertEqual (cached .get (0 ), 0 )
220
+ self .assertEqual (cached .get (0 ), 1 )
208
221
self .assertEqual (cached .lock_count , 2 )
209
- self .assertEqual (cached .get (1 ), 1 )
210
- self .assertEqual (cached .lock_count , 4 )
211
222
self .assertEqual (cached .get (1 ), 2 )
223
+ self .assertEqual (cached .lock_count , 4 )
224
+ self .assertEqual (cached .get (1 ), 3 )
212
225
self .assertEqual (cached .lock_count , 6 )
213
- self .assertEqual (cached .get (1.0 ), 3 )
214
- self .assertEqual (cached .lock_count , 8 )
215
226
self .assertEqual (cached .get (1.0 ), 4 )
227
+ self .assertEqual (cached .lock_count , 8 )
228
+ self .assertEqual (cached .get (1.0 ), 5 )
216
229
self .assertEqual (cached .lock_count , 10 )
217
230
218
231
def test_locked_nocache (self ):
@@ -221,11 +234,11 @@ def test_locked_nocache(self):
221
234
with warnings .catch_warnings (record = True ) as w :
222
235
warnings .simplefilter ("always" )
223
236
224
- self .assertEqual (cached .get (0 ), 0 )
225
- self .assertEqual (cached .get (1 ), 1 )
237
+ self .assertEqual (cached .get (0 ), 1 )
226
238
self .assertEqual (cached .get (1 ), 2 )
227
- self .assertEqual (cached .get (1.0 ), 3 )
239
+ self .assertEqual (cached .get (1 ), 3 )
228
240
self .assertEqual (cached .get (1.0 ), 4 )
241
+ self .assertEqual (cached .get (1.0 ), 5 )
229
242
self .assertEqual (cached .lock_count , 0 )
230
243
231
244
self .assertEqual (len (w ), 5 )
@@ -234,53 +247,53 @@ def test_locked_nocache(self):
234
247
def test_condition_dict (self ):
235
248
cached = Conditioned ({})
236
249
237
- self .assertEqual (cached .get (0 ), 0 )
250
+ self .assertEqual (cached .get (0 ), 1 )
238
251
self .assertEqual (cached .lock_count , 3 )
239
252
self .assertEqual (cached .wait_count , 1 )
240
253
self .assertEqual (cached .notify_count , 1 )
241
- self .assertEqual (cached .get (1 ), 1 )
254
+ self .assertEqual (cached .get (1 ), 2 )
242
255
self .assertEqual (cached .lock_count , 6 )
243
256
self .assertEqual (cached .wait_count , 2 )
244
257
self .assertEqual (cached .notify_count , 2 )
245
- self .assertEqual (cached .get (1 ), 1 )
258
+ self .assertEqual (cached .get (1 ), 2 )
246
259
self .assertEqual (cached .lock_count , 7 )
247
260
self .assertEqual (cached .wait_count , 3 )
248
261
self .assertEqual (cached .notify_count , 2 )
249
- self .assertEqual (cached .get (1.0 ), 1 )
262
+ self .assertEqual (cached .get (1.0 ), 2 )
250
263
self .assertEqual (cached .lock_count , 8 )
251
264
self .assertEqual (cached .wait_count , 4 )
252
265
self .assertEqual (cached .notify_count , 2 )
253
- self .assertEqual (cached .get (1.0 ), 1 )
266
+ self .assertEqual (cached .get (1.0 ), 2 )
254
267
self .assertEqual (cached .lock_count , 9 )
255
268
self .assertEqual (cached .wait_count , 5 )
256
269
self .assertEqual (cached .notify_count , 2 )
257
270
258
271
cached .cache .clear ()
259
- self .assertEqual (cached .get (1 ), 2 )
272
+ self .assertEqual (cached .get (1 ), 3 )
260
273
self .assertEqual (cached .lock_count , 12 )
261
274
self .assertEqual (cached .wait_count , 6 )
262
275
self .assertEqual (cached .notify_count , 3 )
263
276
264
277
def test_condition_nospace (self ):
265
278
cached = Conditioned (LRUCache (maxsize = 0 ))
266
279
267
- self .assertEqual (cached .get (0 ), 0 )
280
+ self .assertEqual (cached .get (0 ), 1 )
268
281
self .assertEqual (cached .lock_count , 3 )
269
282
self .assertEqual (cached .wait_count , 1 )
270
283
self .assertEqual (cached .notify_count , 1 )
271
- self .assertEqual (cached .get (1 ), 1 )
284
+ self .assertEqual (cached .get (1 ), 2 )
272
285
self .assertEqual (cached .lock_count , 6 )
273
286
self .assertEqual (cached .wait_count , 2 )
274
287
self .assertEqual (cached .notify_count , 2 )
275
- self .assertEqual (cached .get (1 ), 2 )
288
+ self .assertEqual (cached .get (1 ), 3 )
276
289
self .assertEqual (cached .lock_count , 9 )
277
290
self .assertEqual (cached .wait_count , 3 )
278
291
self .assertEqual (cached .notify_count , 3 )
279
- self .assertEqual (cached .get (1.0 ), 3 )
292
+ self .assertEqual (cached .get (1.0 ), 4 )
280
293
self .assertEqual (cached .lock_count , 12 )
281
294
self .assertEqual (cached .wait_count , 4 )
282
295
self .assertEqual (cached .notify_count , 4 )
283
- self .assertEqual (cached .get (1.0 ), 4 )
296
+ self .assertEqual (cached .get (1.0 ), 5 )
284
297
self .assertEqual (cached .lock_count , 15 )
285
298
self .assertEqual (cached .wait_count , 5 )
286
299
self .assertEqual (cached .notify_count , 5 )
@@ -291,11 +304,11 @@ def test_condition_nocache(self):
291
304
with warnings .catch_warnings (record = True ) as w :
292
305
warnings .simplefilter ("always" )
293
306
294
- self .assertEqual (cached .get (0 ), 0 )
295
- self .assertEqual (cached .get (1 ), 1 )
307
+ self .assertEqual (cached .get (0 ), 1 )
296
308
self .assertEqual (cached .get (1 ), 2 )
297
- self .assertEqual (cached .get (1.0 ), 3 )
309
+ self .assertEqual (cached .get (1 ), 3 )
298
310
self .assertEqual (cached .get (1.0 ), 4 )
311
+ self .assertEqual (cached .get (1.0 ), 5 )
299
312
self .assertEqual (cached .lock_count , 0 )
300
313
self .assertEqual (cached .wait_count , 0 )
301
314
self .assertEqual (cached .notify_count , 0 )
@@ -317,11 +330,11 @@ def test_wrapped(self):
317
330
cached = Cached (cache )
318
331
319
332
self .assertEqual (len (cache ), 0 )
320
- self .assertEqual (Cached .get .__wrapped__ (cached , 0 ), 0 )
333
+ self .assertEqual (Cached .get .__wrapped__ (cached , 0 ), 1 )
321
334
self .assertEqual (len (cache ), 0 )
322
- self .assertEqual (cached .get (0 ), 1 )
335
+ self .assertEqual (cached .get (0 ), 2 )
323
336
self .assertEqual (len (cache ), 1 )
324
- self .assertEqual (cached .get (0 ), 1 )
337
+ self .assertEqual (cached .get (0 ), 2 )
325
338
self .assertEqual (len (cache ), 1 )
326
339
327
340
def test_attributes (self ):
@@ -355,7 +368,7 @@ def test_clear(self):
355
368
cache = {}
356
369
cached = Cached (cache )
357
370
358
- self .assertEqual (cached .get (0 ), 0 )
371
+ self .assertEqual (cached .get (0 ), 1 )
359
372
self .assertEqual (len (cache ), 1 )
360
373
Cached .get .cache_clear (cached )
361
374
self .assertEqual (len (cache ), 0 )
@@ -364,7 +377,7 @@ def test_clear_locked(self):
364
377
cache = {}
365
378
cached = Locked (cache )
366
379
367
- self .assertEqual (cached .get (0 ), 0 )
380
+ self .assertEqual (cached .get (0 ), 1 )
368
381
self .assertEqual (len (cache ), 1 )
369
382
self .assertEqual (cached .lock_count , 2 )
370
383
Locked .get .cache_clear (cached )
@@ -375,9 +388,47 @@ def test_clear_condition(self):
375
388
cache = {}
376
389
cached = Conditioned (cache )
377
390
378
- self .assertEqual (cached .get (0 ), 0 )
391
+ self .assertEqual (cached .get (0 ), 1 )
379
392
self .assertEqual (len (cache ), 1 )
380
393
self .assertEqual (cached .lock_count , 3 )
381
394
Conditioned .get .cache_clear (cached )
382
395
self .assertEqual (len (cache ), 0 )
383
396
self .assertEqual (cached .lock_count , 4 )
397
+
398
+
399
+ class CachedClassMethodTest (unittest .TestCase ):
400
+
401
+ def test (self ):
402
+ Cached .class_cache = LRUCache (2 )
403
+ Cached .class_count = 0
404
+ cached = Cached (None )
405
+
406
+ self .assertEqual (cached .get_classmethod (0 ), 1 )
407
+ self .assertEqual (Cached .get_classmethod (0 ), 1 )
408
+ self .assertEqual (cached .get_classmethod (1 ), 2 )
409
+ self .assertEqual (Cached .get_classmethod (1 ), 2 )
410
+ self .assertEqual (cached .get_classmethod (1 ), 2 )
411
+ self .assertEqual (Cached .get_classmethod (1 ), 2 )
412
+ self .assertEqual (cached .get_classmethod (1.0 ), 2 )
413
+ self .assertEqual (Cached .get_classmethod (1.0 ), 2 )
414
+ self .assertEqual (Cached .get_classmethod (1.1 ), 3 )
415
+ self .assertEqual (cached .get_classmethod (1.1 ), 3 )
416
+
417
+ cached .class_cache .clear ()
418
+ self .assertEqual (cached .get_classmethod (1 ), 4 )
419
+
420
+ def test_typedmethod (self ):
421
+ Cached .class_cache = LRUCache (2 )
422
+ Cached .class_count = 0
423
+ cached = Cached (None )
424
+
425
+ self .assertEqual (cached .get_typedclassmethod (0 ), 1 )
426
+ self .assertEqual (Cached .get_typedclassmethod (0 ), 1 )
427
+ self .assertEqual (cached .get_typedclassmethod (1 ), 2 )
428
+ self .assertEqual (Cached .get_typedclassmethod (1 ), 2 )
429
+ self .assertEqual (cached .get_typedclassmethod (1.0 ), 3 )
430
+ self .assertEqual (Cached .get_typedclassmethod (1.0 ), 3 )
431
+ self .assertEqual (cached .get_typedclassmethod (0.0 ), 4 )
432
+ self .assertEqual (Cached .get_typedclassmethod (0.0 ), 4 )
433
+ self .assertEqual (Cached .get_typedclassmethod (0 ), 5 )
434
+ self .assertEqual (cached .get_typedclassmethod (0 ), 5 )
0 commit comments