Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemath
GitHub Repository: sagemath/sagecell
Path: blob/master/namespace.py
447 views
1
from collections import defaultdict
2
3
4
class InstrumentedNamespace(dict):
5
def __init__(self, *args, **kwargs):
6
"""
7
Set up a namespace id
8
"""
9
dict.__init__(self,*args,**kwargs)
10
self.events = defaultdict(lambda: defaultdict(list))
11
12
def on(self, key, event, f):
13
self.events[key][event].append(f)
14
15
def off(self, key, event=None, f=None):
16
if event is None:
17
self.events.pop(key, None)
18
elif f is None:
19
self.events[key].pop(event, None)
20
else:
21
self.events[key][event].remove(f)
22
23
def trigger(self, key, event, *args, **kwargs):
24
if key in self.events and event in self.events[key]:
25
for f in self.events[key][event]:
26
f(key, *args, **kwargs)
27
28
def __setitem__(self, key, value):
29
"""
30
Set a value in the dictionary and run attached notification functions.
31
"""
32
if key not in self:
33
self.trigger(key, 'initialize', value)
34
dict.__setitem__(self, key, value)
35
self.trigger(key, 'change', value)
36
37
def __delitem__(self, key):
38
dict.__delitem__(self, key)
39
self.off(key)
40
41