On Jan 28, 1:01 am, Steven D'Aprano <[EMAIL PROTECTED] 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... -- http://mail.python.org/mailman/listinfo/python-list