py3k feature proposal: field auto-assignment in constructors

Steven D'Aprano steve at REMOVE-THIS-cybersource.com.au
Sun Jan 27 20:01:31 EST 2008


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?

-- 
Steven



More information about the Python-list mailing list