blob: 6e0a1819c9c09d861d579f0e241ff3d521801aae [file] [log] [blame]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001"""This module includes tests of the code object representation.
2
3>>> def f(x):
4... def g(y):
5... return x + y
6... return g
7...
8
9>>> dump(f.func_code)
10name: f
11argcount: 1
Guido van Rossum4f72a782006-10-27 23:31:49 +000012kwonlyargcount: 0
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000013names: ()
14varnames: ('x', 'g')
15cellvars: ('x',)
16freevars: ()
17nlocals: 2
18flags: 3
19consts: ('None', '<code object g>')
20
21>>> dump(f(4).func_code)
22name: g
23argcount: 1
Guido van Rossum4f72a782006-10-27 23:31:49 +000024kwonlyargcount: 0
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000025names: ()
26varnames: ('y',)
27cellvars: ()
28freevars: ('x',)
29nlocals: 1
30flags: 19
31consts: ('None',)
32
33>>> def h(x, y):
34... a = x + y
35... b = x - y
36... c = a * b
37... return c
Tim Peters536cf992005-12-25 23:18:31 +000038...
Guido van Rossum4f72a782006-10-27 23:31:49 +000039
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000040>>> dump(h.func_code)
41name: h
42argcount: 2
Guido van Rossum4f72a782006-10-27 23:31:49 +000043kwonlyargcount: 0
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000044names: ()
45varnames: ('x', 'y', 'a', 'b', 'c')
46cellvars: ()
47freevars: ()
48nlocals: 5
49flags: 67
50consts: ('None',)
51
52>>> def attrs(obj):
53... print obj.attr1
54... print obj.attr2
55... print obj.attr3
56
57>>> dump(attrs.func_code)
58name: attrs
59argcount: 1
Guido van Rossum4f72a782006-10-27 23:31:49 +000060kwonlyargcount: 0
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000061names: ('attr1', 'attr2', 'attr3')
62varnames: ('obj',)
63cellvars: ()
64freevars: ()
65nlocals: 1
66flags: 67
67consts: ('None',)
68
Thomas Wouters0e3f5912006-08-11 14:57:12 +000069>>> def optimize_away():
70... 'doc string'
71... 'not a docstring'
72... 53
Guido van Rossume2a383d2007-01-15 16:59:06 +000073... 0x53
Thomas Wouters0e3f5912006-08-11 14:57:12 +000074
75>>> dump(optimize_away.func_code)
76name: optimize_away
77argcount: 0
Guido van Rossum4f72a782006-10-27 23:31:49 +000078kwonlyargcount: 0
Thomas Wouters0e3f5912006-08-11 14:57:12 +000079names: ()
80varnames: ()
81cellvars: ()
82freevars: ()
83nlocals: 0
84flags: 67
85consts: ("'doc string'", 'None')
86
Guido van Rossum4f72a782006-10-27 23:31:49 +000087>>> def keywordonly_args(a,b,*,k1):
88... return a,b,k1
89...
90
91>>> dump(keywordonly_args.func_code)
92name: keywordonly_args
93argcount: 2
94kwonlyargcount: 1
95names: ()
96varnames: ('a', 'b', 'k1')
97cellvars: ()
98freevars: ()
99nlocals: 3
100flags: 67
101consts: ('None',)
102
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000103"""
104
105def consts(t):
106 """Yield a doctest-safe sequence of object reprs."""
107 for elt in t:
108 r = repr(elt)
109 if r.startswith("<code object"):
110 yield "<code object %s>" % elt.co_name
111 else:
112 yield r
113
114def dump(co):
115 """Print out a text representation of a code object."""
Guido van Rossum4f72a782006-10-27 23:31:49 +0000116 for attr in ["name", "argcount", "kwonlyargcount", "names", "varnames",
117 "cellvars", "freevars", "nlocals", "flags"]:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000118 print "%s: %s" % (attr, getattr(co, "co_" + attr))
119 print "consts:", tuple(consts(co.co_consts))
120
121def test_main(verbose=None):
122 from test.test_support import run_doctest
123 from test import test_code
124 run_doctest(test_code, verbose)