On Jan 28, 11:45 am, Steven Bethard <[EMAIL PROTECTED]> wrote:
> Arnaud Delobelle wrote:
> > Sligthly improved (not for performance! but signature-preserving and
> > looks for default values)
>
> > from functools import wraps
> > from inspect import getargspec
> > from itertools import izip, chain
>
> > def autoassign(*names):
> >     def decorator(f):
> >         fargnames, _, _, fdefaults = getargspec(f)
> >         defaults = [(n,v) for (n,v)
> >                     in izip(reversed(fargnames), reversed(fdefaults))
> >                     if n in names]
> >         @wraps(f)
> >         def decorated(self, *args, **kwargs):
> >             self.__dict__.update(defaults)
> >             for name, arg in chain(izip(fargnames, args),
> >                                    kwargs.iteritems()):
> >                 if name in names:
> >                     setattr(self, name, arg)
> >             return f(self, *args, **kwargs)
> >         return decorated
> >     return decorator
>
> > class Test(object):
> >      @autoassign('foo', 'bar')
> >      def __init__(self, foo, bar=3, baz=6):
> >          print 'baz =', baz
>
> > t = Test(1, 2, 6)
> > u = Test(foo=8)
>
> > print t.foo # 1
> > print t.bar # 2
>
> > print u.foo # 8
> > print u.bar # 3 (default)
>
> You should definitely post this to the cookbook:
>
>      http://aspn.activestate.com/ASPN/Cookbook/Python
>
> STeVe

If I may suggest, I would extend this so that autoassign's signature
would be as follows:

autoassign(all=True, include_only=None, exclude=None)

Either one of include_only or exclude could be a list of function to
which the automatic assignment would apply (or not).   I was planning
to write this up and submit it to the cookbook later this evening, but
since the suggestion has been made, someone else can jump on it. ;-)

André
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to