1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
|
from collections import defaultdict
from itertools import repeat
class UseDefaultDictGetItem(defaultdict,object):
__getitem__ = defaultdict.__getitem__
class shield:
def __init__(self,obj):
self.obj=obj
def __enter__(self):
assert self.obj.shield
self.obj.shield= False
self.temp= self.obj.__class__
self.obj.__class__= UseDefaultDictGetItem
return self
def __exit__(self, type, value, traceback):
assert not(self.obj.shield), "state discrepancy, (don't call the __missing__, don't use threads?)"
assert self.temp, "no class to setback"
self.obj.__class__= self.temp# self.obj._basicclass
class D(defaultdict,object):
""" Redirects [missing.__setattr__] to defaultdict """
def shieldDefault(self): self.shield= True # returns None for dd.__init__()
def __init__(self, ):
#self._basicclass= self.__class__
self.shield= False
self.lock= shield(self)
defaultdict.__init__(self, self.shieldDefault )#repeat(None).next)
def __setitem__(self, k,v):
if self.shield:
with self.lock: self[k]=v #v= defaultdict.__setitem__(self, k,v) #defaultdict ne marche pas
else:
print " CALLS D.setitem"
defaultdict.__setitem__(self, k,v)
if __name__ == '__main__':
y= D()
print "y[0]:"
print y[0] # D.__setitem__ n'est pas appelé (valeur manquante)
print "set et y[0]:"
y[0]=1
print y[0] # D.__setitem__ est appelé (key presente) |
Partager