tomer filiba wrote:
> to my understanding of the object model, the code of snippet 1
> and snippet 2 should be equivalent. a class is just a "special function"
> that returns its locals automatically and passes them to the metaclass
> constructor:

PEP 227 (Statically Nested Scopes) covers this in detail (and it echoes 
Guido's earlier message - the lexical scoping skips class statements because 
class attributes are intended to be accessed via attribute reference on the 
class or instance, not as a bare name).

You'll probably find the resulting behaviour less surprising if you think of 
class creation in terms of the exec statement rather than as involving any 
kind of function definition:

   d = dict()
   exec <class body> in globals(), d
   mcl = _determine_metaclass(d, <class bases>) # Not magic, but close ;)
   cls = mcl(<class name>, <class bases>, d)

Class bodies actually have more in common with module level code than they do 
with function bodies (e.g. see how far you get trying to pass a function's 
co_code object to the exec statement - it breaks for reasons somewhat related 
to what we're discussing here).

To go back to your original example, the second snippet should actually look 
more like this:

--- snippet 2a ---
body = """
x = 5
def g(self):
     print "g", x
"""

d = dict()
exec body in globals(), d
barcls = type("barcls", (object,), d)
------

.>>> barcls().g()
g
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
   File "<string>", line 4, in g
NameError: global name 'x' is not defined

Cheers,
Nick.

-- 
Nick Coghlan   |   [EMAIL PROTECTED]   |   Brisbane, Australia
---------------------------------------------------------------
             http://www.boredomandlaziness.org
_______________________________________________
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

Reply via email to