On Mon, 28 Jan 2008 08:04:05 +0100, Torsten Bronger wrote:
>> Are you referring to the alternate syntax or to the decorator? Either
>> way, you could be saving 4 or 5 or more lines, if you have enough
>> arguments.
>
> Mostly, I write them in one or two lines, e.g.
>
> def __init__(self, id, kind, person, feedname):
> self.id, self.kind, self.person = id, kind, person
It's not the number of lines that is important, but the amount of
redundant code, and the amount of redundant code is identical whether you
write it in one line or three.
The problem is that instance initialization frequently and regularly
breaks the principle "Don't Repeat Yourself". Whether you initialize your
code like this:
self.id = id
self.kind = kind
self.person person
or like this:
self.id = id; self.kind = kind; self.person = person
or like this:
self.id, self.kind, self.person = id, kind, person
you are repeating yourself.
Unfortunately, without syntactical support, I don't think there is any
easy way to tell the compiler which arguments to auto-initialize and
which to skip. And Guido rightly is reluctant to create special syntax
for special cases, and something which happens only in __init__ (and
maybe __new__?) is certainly a special case.
That leaves a decorator solution, married with a convention for names.
Here's a thought... why assume that the convention is a prefix? What
about a suffix?
@autoassign
def __init__(self, spam_, ham_, eggs):
pass
A trailing underscore doesn't conflict with the conventions for leading
underscores. The only conflict is with the convention that if you want a
name that looks like a reserved word you put an underscore after it.
Since Python has very few reserved words, and they rarely make good
argument names, there should be far fewer conflicts with an underscore
suffix rather than a prefix.
I'd still prefer compiler support, preferably with a leading & as syntax.
Since all the work would happen at compile time, it wouldn't effect the
runtime speed, and it wouldn't lead to any confusion with function
signatures. The class you get would be exactly the same as if you had
done the attribute initialization by hand, except the compiler did it.
That's the ideal solution, but failing that, a decorator solution with a
trailing _ gets my vote.
--
Steven
--
http://mail.python.org/mailman/listinfo/python-list