Skip to content

Instantly share code, notes, and snippets.

@dennythecoder
Last active August 15, 2024 01:38
Show Gist options
  • Save dennythecoder/7e389602144377417443e93eaacf6c1e to your computer and use it in GitHub Desktop.
Save dennythecoder/7e389602144377417443e93eaacf6c1e to your computer and use it in GitHub Desktop.
wip python attempt at creating object with dynamic props
import inspect
def Reactive(obj):
class ReactiveObject(object):
def __init__(self, obj, storage):
self.storage = storage
self.obj = obj
def on_change(self, key, newValue, prevValue):
if 'on_change' in self.obj[key]:
fn = self.obj[key]['on_change']
ln = len(inspect.signature(fn).parameters)
if ln == 0:
fn()
elif ln == 1:
fn(newValue)
elif ln == 2:
fn(newValue, prevValue)
else:
print(key, newValue, prevValue)
storage = {}
def create_fget(key):
def fget(self):
val = self.storage[key]
if 'fget' in self.obj[key]:
return self.obj[key]['fget'](val)
else:
return val
return fget
def create_fset(key):
def fset(self, newValue):
currentValue = self.storage[key]
if currentValue != newValue:
if 'fset' in self.obj[key]:
self.obj[key]['fset'](val)
else:
self.storage[key] = newValue
print(self.storage[key])
self.on_change(key, newValue, currentValue)
return fset
for key,item in obj.items():
storage[key] = item['value']
fget = create_fget(key)
fset = create_fset(key)
prop = property(fget, fset)
setattr(ReactiveObject, key, prop)
return ReactiveObject(obj, storage)
a = Reactive({
'a':{
'value':3,
'fget':lambda val:val+1,
'on_change':lambda : print('oooh')
},
'b':{
'value':'hello',
'on_change':lambda x, y: print('oh', x, y)
}
})
print(a.a == 4)
print(a.b == 'hello')
a.a = 8
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment