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