py3k feature proposal: field auto-assignment in constructors

MRAB google at mrabarnett.plus.com
Mon Jan 28 02:28:33 CET 2008


On Jan 28, 1:01 am, Steven D'Aprano <st... at REMOVE-THIS-
cybersource.com.au> wrote:
> On Mon, 28 Jan 2008 00:39:02 +0100, Wildemar Wildenburger wrote:
> > Dustan wrote:
> >>> Well, you save one or two lines per class.  Not enough in my opinion.
>
> >> 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.
>
> > OK, but then again, every decent IDE should give you the tools to write
> > an automation for that. Not that I don't like the idea of
> > auto-assignment, but, you know ...
>
> You know, not everybody uses a "decent IDE", by choice or necessity, and
> even if they did, having what is essentially a macro to type for you
> doesn't solve the essential problem that you're writing the same thing
> THREE TIMES instead of once. And then you have to keep it all in sync
> through who knows how many code revisions and refactorings.
>
> class Parrot(object):  # after many revisions...
>     def __init__(self, genus, species, variety, name, age, colours,
>         wingspan, beaksize, healthstate, language, vocabulary):
>         self.wingspan = wingspan
>         self.beaksize = beaksize
>         self.name = name
>         self.age = age
>         self.binomial_name = (genus, species)
>         self.breed = variety
>         self.colour = colour
>         self.language = language
>         self.state = get_state(healthstate)
>         self.words = vocabulary
>         self.colors = colours
>
> What IDE will spot the error(s) in the above?
>
> Here's another version, assuming syntax support for auto-assignment for
> names starting with an ampersand:
>
> class Parrot(object):  # after many revisions...
>     def __init__(self, genus, species, variety, &name, &age, &colours,
>         &wingspan, &beaksize, healthstate, &language, vocabulary):
>         self.binomial_name = (genus, species)
>         self.breed = variety
>         self.state = get_state(healthstate)
>         self.words = vocabulary
>
> See how much easier it is to keep the attributes synced with the
> arguments? Don't Repeat Yourself in action.
>
> I think the biggest minus on this proposal is that it creates new syntax
> that is only meaningful in the __init__ method of a class. "Special cases
> aren't special enough to break the rules." I'd vote for it, but
> conditionally. What should this do?
>
> def foo(x, y, &z):
>     pass
>
> Create foo.z perhaps?
>
Well, if:

def __init__(self, &foo):
    pass

does:

def __init__(self, foo):
    self.foo = foo

then:

def foo(x, y, &z):
    pass

does:

def foo(x, y, &z):
    x.z = z

Don't think that's useful, though...



More information about the Python-list mailing list