23
23
from .transforms import IdentityTransform , Transform
24
24
import contextlib
25
25
26
+
26
27
class exdict (dict ):
27
28
28
29
def __init__ (self , * args , ** kwargs ):
29
30
super (exdict , self ).__init__ (* args , ** kwargs )
30
31
self ._memory = dict ()
31
32
32
- def __setitem__ (self , key , value ):
33
+ def __setitem__ (self , key , new ):
33
34
try :
34
35
old = self [key ]
35
36
except KeyError :
36
- old = self ._default_method (key )
37
-
38
- self ._memory [key ] = old
39
- super (exdict , self ).__setitem__ (key , value )
37
+ old = self ._default_generator (key )
38
+ if old != new :
39
+ self ._memory [key ] = old
40
+ super (exdict , self ).__setitem__ (key , new )
41
+
42
+ def update (self , * args , ** kwargs ):
43
+ if len (args ) > 1 :
44
+ raise TypeError ("update expected at most 1 arguments, got %d" % len (args ))
45
+ other = dict (* args , ** kwargs )
46
+ for key in other :
47
+ self [key ] = other [key ]
48
+
49
+ def setdefault (self , key , value = None ):
50
+ if key not in self :
51
+ self [key ] = self ._default_generator ()
52
+ return self [key ]
40
53
41
54
def ex (self , key ):
42
- return self ._memory .get (key ,self [key ])
55
+ try :
56
+ return self ._memory [key ]
57
+ except KeyError , e :
58
+ return self ._default_generator (key )
43
59
44
- def _default_method (self , key ): pass
60
+ def _default_generator (self , key ): pass
45
61
46
62
47
63
class PrivateMethodMixin (object ):
@@ -50,7 +66,7 @@ def __new__(cls, *args, **kwargs):
50
66
inst = super (PrivateMethodMixin ,cls ).__new__ (cls , * args , ** kwargs )
51
67
inst ._trait_values = exdict (inst ._trait_values )
52
68
meth = lambda klass , key : getattr (klass , key ).default_value
53
- inst ._trait_values ._default_method = MethodType (meth , cls )
69
+ inst ._trait_values ._default_generator = MethodType (meth , cls )
54
70
return inst
55
71
56
72
def force_callback (self , name , cross_validate = True ):
0 commit comments