You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Here is some proof of concept code I wrote that demonstrates how Dectate might work if we use a more functional way to define directives, instead of using the action subclasses we do now. The idea is to make the signature of the directive be the correct signature right away if we generated code or alternatively used a library like wrapt.
This does require us to give up on the current with statement as that allows you to define a subset of functions. This could be replaced by pointing people in the direction of functools.partial.
class App(object):
registered = []
@classmethod
def commit(cls):
for perform, config, obj in cls.registered:
kw = {}
for key, value in config.items():
for name, factory in config.items():
c = getattr(cls, name, None)
if c is None:
c = factory()
setattr(cls, name, c)
kw[name] = c
perform(obj, **kw)
def action(config):
def get_directive(func):
def wrapper(cls, *args, **kw):
info = func(cls, *args, **kw)
def register(obj):
cls.registered.append(
(info.perform, get_directive.config, obj))
return obj
return register
return classmethod(wrapper)
get_directive.config = config
return get_directive
class Info(object):
def __init__(self, perform):
self.perform = perform
class MyApp(App):
@action(config={'r': dict})
def mydecorator(cls, message):
def perform(obj, r):
r[message] = obj
return Info(perform)
@MyApp.mydecorator('foo')
def myfunction():
return "the function"
MyApp.commit()
assert MyApp.r == {'foo': myfunction}
The text was updated successfully, but these errors were encountered:
Here is some proof of concept code I wrote that demonstrates how Dectate might work if we use a more functional way to define directives, instead of using the action subclasses we do now. The idea is to make the signature of the directive be the correct signature right away if we generated code or alternatively used a library like
wrapt
.This does require us to give up on the current
with
statement as that allows you to define a subset of functions. This could be replaced by pointing people in the direction offunctools.partial
.The text was updated successfully, but these errors were encountered: