@@ -4,16 +4,20 @@ from cpython cimport PyDict_Contains, PyDict_GetItem, PyDict_GetItem
4
4
cdef class cache_readonly(object ):
5
5
6
6
cdef readonly:
7
- object fget , name
7
+ object func , name, allow_setting
8
8
9
- def __init__ (self , func ):
10
- self .fget = func
11
- self .name = func.__name__
9
+ def __init__ (self , func = None , allow_setting = False ):
10
+ if func is not None :
11
+ self .func = func
12
+ self .name = func.__name__
13
+ self .allow_setting = allow_setting
12
14
13
- def __get__ (self , obj , type ):
14
- if obj is None :
15
- return self .fget
15
+ def __call__ (self , func , doc = None ):
16
+ self .func = func
17
+ self .name = func.__name__
18
+ return self
16
19
20
+ def __get__ (self , obj , typ ):
17
21
# Get the cache or set a default one if needed
18
22
19
23
cache = getattr (obj, ' _cache' , None )
@@ -23,12 +27,23 @@ cdef class cache_readonly(object):
23
27
if PyDict_Contains(cache, self .name):
24
28
# not necessary to Py_INCREF
25
29
val = < object > PyDict_GetItem(cache, self .name)
26
- return val
27
30
else :
28
- val = self .fget (obj)
31
+ val = self .func (obj)
29
32
PyDict_SetItem(cache, self .name, val)
30
- return val
33
+ return val
34
+
35
+ def __set__ (self , obj , value ):
36
+
37
+ if not self .allow_setting:
38
+ raise Exception (" cannot set values for [%s ]" % self .name)
39
+
40
+ # Get the cache or set a default one if needed
41
+ cache = getattr (obj, ' _cache' , None )
42
+ if cache is None :
43
+ cache = obj._cache = {}
31
44
45
+ PyDict_SetItem(cache, self .name, value)
46
+
32
47
cdef class AxisProperty(object ):
33
48
cdef:
34
49
Py_ssize_t axis
0 commit comments