Josiah Carlson wrote:
Greg Ewing email@example.com wrote:
Josiah Carlson wrote:
class foo: class a(Property): ''' documentation ''' def get(self): return self._a ...
I'm curious as to why this still gets brought up when the obvious syntax is more or less identical to basically all reasonable alternate syntaxes.
I would dispute that anything involving a class statement that creates something other than a class is "obvious".
The "Property" statement that is longer, the existance of get/set/de1 methods, those didn't catch your eye? What if the user plopped in a nice big "__metaclass__ = Property" line? Ugly or not, I find that it has helped me organize (with indentation), not repeat myself, and not have to clean up spare get/set/del methods. I personally prefer it to x = property(...), a property decorator, and a bazillion times more than any property-specific syntax.
Your original question was on how obvious this is to *invent*, but here you're defending how obvious it is to *read*. (FWIW, I think it reads just fine, and I've added a couple of new, nifty things to my personal library. Thanks for the pointer.) Inner-class-as-a-class-variable is the mental leap you have to make, plus you have to be comfortable with metaclasses. I expect most developers would get to "hey, let's add a new keyword" before they arrive at that. Some proportion of those would bring it up on a mailing list, and then some proportion of the mailing list recipients would have seen it before, and some proportion of those recipients might feel a little exasperated and wonder how the rest of us can be so blind as to miss such an obvious solution...
It's statistics, babay.
On a very related topic, I find it interesting how often classes get abused just to provide a convenient namespace to stick things in. Classes are heavy things, though, with a lot of semantics and behind-the-scenes witchery to deal with inheritance and metaclasses and such-like. Why bring that baggage into it? It might be nice to be able to declare a one-off namespace:
class Foo: x: '''documentation''' def __get__(self, instance, owner): # self = x, instance = a Foo(), owner = Foo() return instance._x
logger: '''Singleton logger object blah blah...''' db = make_db_connection(...)
def log(self, message): ...
Be gentle, because I haven't thought this through very well. :)