[Python-Dev] classes and cell variables question

tomer filiba tomerfiliba at gmail.com
Tue Dec 19 22:59:37 CET 2006


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:

--- snippet 1 ---
class foo(object):
    x = 5
    def f(self):
        print "f", x

--- snippet 2 ---
def bar():
    x = 5
    def g(self):
        print "g", x
    return locals()
barcls = type("barcls", (object,), bar())

but there's one big difference. classes don't create cell variables
to hold bound external variables. the "bar" version works, because
"x" is a bound cell variable, but the "foo" version fails, as it attempts
to access "x" as a global.

.>>> barcls().g()
g 5

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

for reference, i attached the code of all four functions below.

my question is, how come classes don't create cell variables, like
normal functions? was this done on purpose? does it have to
do with inheritance? if so, what's wrong with my "bar" version?


[1]
# code of class foo
############################################################
#  2           0 LOAD_NAME                0 (__name__)
#              3 STORE_NAME               1 (__module__)
#  3           6 LOAD_CONST               0 (5)
#              9 STORE_NAME               2 (x)
#
#  4          12 LOAD_CONST               1 (<code object f at
009E5608, file "<stdin>", line 4>)
#             15 MAKE_FUNCTION            0
#             18 STORE_NAME               3 (f)
#             21 LOAD_LOCALS
#             22 RETURN_VALUE

[2]
# code of foo.f:
############################################################
#  5           0 LOAD_CONST               1 ('f')
#              3 PRINT_ITEM
#              4 LOAD_GLOBAL              0 (x)
#              7 PRINT_ITEM
#              8 PRINT_NEWLINE
#              9 LOAD_CONST               0 (None)
#             12 RETURN_VALUE

[3]
# code of bar:
############################################################
#  2           0 LOAD_CONST               1 (5)
#              3 STORE_DEREF              0 (x)
#
#  3           6 LOAD_CLOSURE             0 (x)
#              9 BUILD_TUPLE              1
#             12 LOAD_CONST               2 (<code object g at
009F6698, file "<stdin>", line 3>)
#             15 MAKE_CLOSURE             0
#             18 STORE_FAST               0 (g)
#
#  5          21 LOAD_GLOBAL              0 (locals)
#             24 CALL_FUNCTION            0
#             27 RETURN_VALUE

[4]
# code of bar.g:
############################################################
#  4           0 LOAD_CONST               1 ('g')
#              3 PRINT_ITEM
#              4 LOAD_DEREF               0 (x)
#              7 PRINT_ITEM
#              8 PRINT_NEWLINE
#              9 LOAD_CONST               0 (None)
#             12 RETURN_VALUE


More information about the Python-Dev mailing list