mirror of
https://github.com/python/cpython.git
synced 2025-07-24 19:54:21 +00:00

in the byte code and co_consts even if they were not used, ie immediately popped off the stack.
102 lines
1.9 KiB
Python
102 lines
1.9 KiB
Python
"""This module includes tests of the code object representation.
|
|
|
|
>>> def f(x):
|
|
... def g(y):
|
|
... return x + y
|
|
... return g
|
|
...
|
|
|
|
>>> dump(f.func_code)
|
|
name: f
|
|
argcount: 1
|
|
names: ()
|
|
varnames: ('x', 'g')
|
|
cellvars: ('x',)
|
|
freevars: ()
|
|
nlocals: 2
|
|
flags: 3
|
|
consts: ('None', '<code object g>')
|
|
|
|
>>> dump(f(4).func_code)
|
|
name: g
|
|
argcount: 1
|
|
names: ()
|
|
varnames: ('y',)
|
|
cellvars: ()
|
|
freevars: ('x',)
|
|
nlocals: 1
|
|
flags: 19
|
|
consts: ('None',)
|
|
|
|
>>> def h(x, y):
|
|
... a = x + y
|
|
... b = x - y
|
|
... c = a * b
|
|
... return c
|
|
...
|
|
>>> dump(h.func_code)
|
|
name: h
|
|
argcount: 2
|
|
names: ()
|
|
varnames: ('x', 'y', 'a', 'b', 'c')
|
|
cellvars: ()
|
|
freevars: ()
|
|
nlocals: 5
|
|
flags: 67
|
|
consts: ('None',)
|
|
|
|
>>> def attrs(obj):
|
|
... print obj.attr1
|
|
... print obj.attr2
|
|
... print obj.attr3
|
|
|
|
>>> dump(attrs.func_code)
|
|
name: attrs
|
|
argcount: 1
|
|
names: ('attr1', 'attr2', 'attr3')
|
|
varnames: ('obj',)
|
|
cellvars: ()
|
|
freevars: ()
|
|
nlocals: 1
|
|
flags: 67
|
|
consts: ('None',)
|
|
|
|
>>> def optimize_away():
|
|
... 'doc string'
|
|
... 'not a docstring'
|
|
... 53
|
|
... 53L
|
|
|
|
>>> dump(optimize_away.func_code)
|
|
name: optimize_away
|
|
argcount: 0
|
|
names: ()
|
|
varnames: ()
|
|
cellvars: ()
|
|
freevars: ()
|
|
nlocals: 0
|
|
flags: 67
|
|
consts: ("'doc string'", 'None')
|
|
|
|
"""
|
|
|
|
def consts(t):
|
|
"""Yield a doctest-safe sequence of object reprs."""
|
|
for elt in t:
|
|
r = repr(elt)
|
|
if r.startswith("<code object"):
|
|
yield "<code object %s>" % elt.co_name
|
|
else:
|
|
yield r
|
|
|
|
def dump(co):
|
|
"""Print out a text representation of a code object."""
|
|
for attr in ["name", "argcount", "names", "varnames", "cellvars",
|
|
"freevars", "nlocals", "flags"]:
|
|
print "%s: %s" % (attr, getattr(co, "co_" + attr))
|
|
print "consts:", tuple(consts(co.co_consts))
|
|
|
|
def test_main(verbose=None):
|
|
from test.test_support import run_doctest
|
|
from test import test_code
|
|
run_doctest(test_code, verbose)
|