py3k feature proposal: field auto-assignment in constructors

Arnaud Delobelle arnodel at googlemail.com
Sun Jan 27 20:51:28 EST 2008


On Jan 27, 6:32 pm, "Diez B. Roggisch" <de... at nospam.web.de> wrote:
> Wildemar Wildenburger schrieb:
>
> > André wrote:
> >> Personally, I like the idea you suggest, with the modification that I
> >> would use "." instead of "@", as in
>
> >> class Server(object):
> >>     def __init__(self, .host, .port, .protocol, .bufsize, .timeout):
> >>         pass
>
> > I like :)
>
> > However, you can probably cook up a decorator for this (not certain, I'm
> > not a decorator Guru), which is not that much worse.
>
> > Still, I'd support that syntax (and the general idea.).
>
> Just for the fun of it, I implemented a decorator:
>
> from functools import *
> from inspect import *
>
> def autoassign(_init_):
>      @wraps(_init_)
>      def _autoassign(self, *args, **kwargs):
>          argnames, _, _, _ = getargspec(_init_)
>          for name, value in zip(argnames[1:], args):
>              setattr(self, name, value)
>          _init_(self, *args, **kwargs)
>
>      return _autoassign

Nice!  I've got a slight variation without magic argument names:

def autoassign(*names):
    def decorator(f):
        def decorated(self, *args, **kwargs):
            for name in names:
                setattr(self, name, kwargs.pop(name))
            return f(self, *args, **kwargs)
        return decorated
    return decorator

class Test(object):
     @autoassign('foo', 'bar')
     def __init__(self, baz):
         print 'baz =', baz

t = Test(foo=1, bar=2, baz=6)
# or Test(6, foo=1, bar=2)

print t.foo
print t.bar
print t.baz

--
Arnaud




More information about the Python-list mailing list