|  | """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 | 
|  | kwonlyargcount: 0 | 
|  | 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 | 
|  | kwonlyargcount: 0 | 
|  | 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 | 
|  | kwonlyargcount: 0 | 
|  | 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 | 
|  | kwonlyargcount: 0 | 
|  | 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 | 
|  | kwonlyargcount: 0 | 
|  | names: () | 
|  | varnames: () | 
|  | cellvars: () | 
|  | freevars: () | 
|  | nlocals: 0 | 
|  | flags: 67 | 
|  | consts: ("'doc string'", 'None') | 
|  |  | 
|  | >>> def keywordonly_args(a,b,*,k1): | 
|  | ...     return a,b,k1 | 
|  | ... | 
|  |  | 
|  | >>> dump(keywordonly_args.func_code) | 
|  | name: keywordonly_args | 
|  | argcount: 2 | 
|  | kwonlyargcount: 1 | 
|  | names: () | 
|  | varnames: ('a', 'b', 'k1') | 
|  | cellvars: () | 
|  | freevars: () | 
|  | nlocals: 3 | 
|  | flags: 67 | 
|  | consts: ('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", "kwonlyargcount", "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) |