At 07:20 PM 4/19/2006 +1200, Greg Ewing wrote: >Phillip J. Eby wrote: > >>That is, it defines the function with MAKE_CLOSURE instead of >>MAKE_FUNCTION. It also puts a reference to the cell object in the >>class's dictionary, let's say under __cell__. > >Presumably it would first check if there was already a __cell__ >put there by another function and use that.
No, the compiler does it, it's not an execution time thing. That is, the code object is set for a certain number of "cell vars", and that's what allocates the cell object when the code is executed and the frame is set up. >What happens if the function gets wrapped by a decorator? I >suppose it still works, because the cell remains attached to >the innermost function where it's needed, right? Right, it's part of the function object's func_closure tuple. >>Or perhaps the 'type' constructor takes care of this, but if we can have >>class decorators it might be better to have MAKE_CLASS do it so it always >>points to the object that *will* be bound to the class name in the >>enclosing scope. > >Isn't that backwards? MAKE_CLASS is going to bind it to the >class created by the basic class statement, before the >decorators get to work on it. The object returned by the >decorators might be something different. Sorry, I was thinking of PyProtocols/zope.interface style class decorators, which work by metaclass munging. That probably means that the scope enclosing the class should define the cell, and have a stanza like: MAKE_CLASS ... decorators, if any ... DUP_TOP STORE_DEREF __cell_for_this_class__ STORE_NAME "classname" And this way, it doesn't need to be an attribute of the class object. _______________________________________________ Python-3000 mailing list Python-3000@python.org http://mail.python.org/mailman/listinfo/python-3000 Unsubscribe: http://mail.python.org/mailman/options/python-3000/archive%40mail-archive.com