Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import weakref
- import gc
- builtin_types = (bool, float, int, str)
- class MemoryStuff():
- id = 0
- def __init__(self):
- MemoryStuff.id += 1
- self.id = MemoryStuff.id
- def __repr__(self):
- return "{Memory#" + str(self.id) + "}"
- class WeakDictBase:
- primdict = {}
- def keys(self):
- return self.objdict.keys() + self.primdict.keys()
- def __len__(self):
- return len(self.objdict) + len(self.primdict)
- class WeakKeyDict(WeakDictBase):
- objdict = weakref.WeakKeyDictionary()
- def __getitem__(self, key):
- dict = self.primdict if type(key) in builtin_types else self.objdict
- return dict[key] if key in dict else "Not found"
- def __setitem__(self, key, val):
- if type(key) in builtin_types:
- self.primdict[key] = val
- else:
- self.objdict[key] = val
- class WeakValueDict(WeakDictBase):
- objdict = weakref.WeakValueDictionary()
- def __getitem__(self, key):
- if key in self.primdict:
- return self.primdict[key]
- elif key in self.objdict:
- return self.objdict[key]
- return "Not found"
- def __setitem__(self, key, val):
- if type(val) in builtin_types:
- if key in self.objdict:
- del self.objdict[key]
- self.primdict[key] = val
- else:
- if key in self.primdict:
- del self.primdict[key]
- self.objdict[key] = val
- class WeakKeyValueDict(dict):
- def __getitem__(self, key):
- val = dict.__getitem__(self, key)
- return val() if isinstance(val, weakref.ref) else val
- def __setitem__(self, key, val):
- k = key if type(key) in builtin_types else weakref.ref(key)
- v = val if type(val) in builtin_types else weakref.ref(val)
- return dict.__setitem__(self, k, v)
- def keys(self):
- return filter(lambda key: not isinstance(key, weakref.ref) or key() is not None, dict.keys(self))
- print("--- Weak Keys ---")
- a = WeakKeyDict()
- a[10] = 100
- x = MemoryStuff()
- a[x] = 777
- print("keys: ")
- print(a.keys())
- print(len(a))
- print(a[x])
- x = 555
- print("-- gc --")
- gc.collect()
- print("keys: ")
- print(a.keys())
- print(len(a))
- print(a[x])
- print("--- Weak Values ---")
- a = WeakValueDict()
- a[10] = 100
- x = MemoryStuff()
- a[x] = 777
- y = MemoryStuff()
- a[10] = y
- print("keys: ")
- print(a.keys())
- print(len(a))
- print(a[x])
- y = 20
- print("-- gc --")
- gc.collect()
- print("keys: ")
- print(a.keys())
- print(len(a))
- print(a[x])
- print("--- Weak Keys & Values ---")
- a = WeakKeyValueDict()
- a[10] = 100
- obj = MemoryStuff()
- stuff = MemoryStuff()
- a[obj] = 100
- a[100] = obj
- a[stuff] = obj
- print("keys: ")
- print(a.keys())
- print(len(a))
- print(a[10])
- print(a[100])
- obj = 10
- stuff = 20
- gc.collect()
- print("keys: ")
- print(a.keys())
- print(len(a))
- print(a[10])
- print(a[100])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement