On Wed, Mar 29, 2006 at 07:23:03PM -0500, Phillip J. Eby wrote: > At 11:07 AM 3/29/2006 -0800, Guido van Rossum wrote: > >On 3/28/06, Phillip J. Eby <[EMAIL PROTECTED]> wrote: > > > If we're using Zope 3 as an example, I personally find that: > > > > > > class Foo: > > > """Docstring here, blah blah blah > > > """ > > > implements(IFoo) > > > > > > is easier to read than: > > > > > > @implements(IFoo) > > > class Foo: > > > """Docstring here, blah blah blah > > > """ > > > >But the former also smells more of magic. > > My comment above was only about readable *placement* of the decorators, not > the actual syntax. Many approaches to the actual syntax in the body are > possible. > > For example, what did you think of Fred Drakes's "@class" proposal? To > specify it formally, one could say that this: > > @class EXPR > > in a class scope would expand to the equivalent of: > > locals().setdefault('__decorators__',[]).append(EXPR) > > and is a syntax error if placed anywhere else. That, combined with support > for processing __decorators__ at class creation time, would fulfill the > desired semantics without any implicit "magic". >
A function decorator takes a function as an argument and returns something (probably a function and maybe even the very same function). This is exactly what class decorators should do or we should call them something else and give them a distinct syntax. A function decorator is there to replace code like: def myfunc(a, b, c): # half a screen of code myfunc = mangle(myfunc) Likewise class decorators would save me from typing class MyClass: # many functions taking half a screen of code each register(MyClass, db_id=20) I used to do this with metaclasses but stopped because it requires making 'db_id' a member of the class which is magically noticed by a metaclass two files away. Using metaclasses also required gross hacks like checking for a 'DO_NOT_REGISTER' member for subclasses that wanted to inherit from a class that had a Register metaclass but didn't want to be registered. Yuck. If you want to do lots of Zopeish stuff mostly inside the class write a decorator that looks for it in the class body. @zope.find_magic_in_attr('mymagic') class MyClass: mymagic = [] # some long hairy thing Talking about something other than a decorator or proposing all new syntax is just going to get this pronounced out of existence. If-I-wanted-zope-I'd-use-zope-ly, -jackdied _______________________________________________ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com