test_code.py revision 4f72a78684bbfcdc43ceeabb240ceee54706c4b0
13e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton"""This module includes tests of the code object representation.
23e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
33e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton>>> def f(x):
43e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton...     def g(y):
53e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton...         return x + y
63e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton...     return g
73e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton...
83e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
93e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton>>> dump(f.func_code)
103e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonname: f
113e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonargcount: 1
124f72a78684bbfcdc43ceeabb240ceee54706c4b0Guido van Rossumkwonlyargcount: 0
133e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonnames: ()
143e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonvarnames: ('x', 'g')
153e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncellvars: ('x',)
163e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonfreevars: ()
173e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonnlocals: 2
183e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonflags: 3
193e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonconsts: ('None', '<code object g>')
203e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
213e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton>>> dump(f(4).func_code)
223e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonname: g
233e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonargcount: 1
244f72a78684bbfcdc43ceeabb240ceee54706c4b0Guido van Rossumkwonlyargcount: 0
253e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonnames: ()
263e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonvarnames: ('y',)
273e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncellvars: ()
283e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonfreevars: ('x',)
293e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonnlocals: 1
303e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonflags: 19
313e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonconsts: ('None',)
323e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
333e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton>>> def h(x, y):
343e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton...     a = x + y
353e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton...     b = x - y
363e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton...     c = a * b
373e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton...     return c
38536cf99536bce562cfcb44a856fac1c84b9de4c3Tim Peters...
394f72a78684bbfcdc43ceeabb240ceee54706c4b0Guido van Rossum
403e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton>>> dump(h.func_code)
413e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonname: h
423e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonargcount: 2
434f72a78684bbfcdc43ceeabb240ceee54706c4b0Guido van Rossumkwonlyargcount: 0
443e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonnames: ()
453e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonvarnames: ('x', 'y', 'a', 'b', 'c')
463e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncellvars: ()
473e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonfreevars: ()
483e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonnlocals: 5
493e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonflags: 67
503e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonconsts: ('None',)
513e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
523e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton>>> def attrs(obj):
533e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton...     print obj.attr1
543e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton...     print obj.attr2
553e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton...     print obj.attr3
563e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
573e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton>>> dump(attrs.func_code)
583e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonname: attrs
593e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonargcount: 1
604f72a78684bbfcdc43ceeabb240ceee54706c4b0Guido van Rossumkwonlyargcount: 0
613e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonnames: ('attr1', 'attr2', 'attr3')
623e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonvarnames: ('obj',)
633e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncellvars: ()
643e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonfreevars: ()
653e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonnlocals: 1
663e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonflags: 67
673e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonconsts: ('None',)
683e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
690e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters>>> def optimize_away():
700e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters...     'doc string'
710e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters...     'not a docstring'
720e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters...     53
730e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters...     53L
740e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters
750e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters>>> dump(optimize_away.func_code)
760e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Woutersname: optimize_away
770e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Woutersargcount: 0
784f72a78684bbfcdc43ceeabb240ceee54706c4b0Guido van Rossumkwonlyargcount: 0
790e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Woutersnames: ()
800e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Woutersvarnames: ()
810e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouterscellvars: ()
820e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Woutersfreevars: ()
830e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Woutersnlocals: 0
840e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Woutersflags: 67
850e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Woutersconsts: ("'doc string'", 'None')
860e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters
874f72a78684bbfcdc43ceeabb240ceee54706c4b0Guido van Rossum>>> def keywordonly_args(a,b,*,k1):
884f72a78684bbfcdc43ceeabb240ceee54706c4b0Guido van Rossum...     return a,b,k1
894f72a78684bbfcdc43ceeabb240ceee54706c4b0Guido van Rossum...
904f72a78684bbfcdc43ceeabb240ceee54706c4b0Guido van Rossum
914f72a78684bbfcdc43ceeabb240ceee54706c4b0Guido van Rossum>>> dump(keywordonly_args.func_code)
924f72a78684bbfcdc43ceeabb240ceee54706c4b0Guido van Rossumname: keywordonly_args
934f72a78684bbfcdc43ceeabb240ceee54706c4b0Guido van Rossumargcount: 2
944f72a78684bbfcdc43ceeabb240ceee54706c4b0Guido van Rossumkwonlyargcount: 1
954f72a78684bbfcdc43ceeabb240ceee54706c4b0Guido van Rossumnames: ()
964f72a78684bbfcdc43ceeabb240ceee54706c4b0Guido van Rossumvarnames: ('a', 'b', 'k1')
974f72a78684bbfcdc43ceeabb240ceee54706c4b0Guido van Rossumcellvars: ()
984f72a78684bbfcdc43ceeabb240ceee54706c4b0Guido van Rossumfreevars: ()
994f72a78684bbfcdc43ceeabb240ceee54706c4b0Guido van Rossumnlocals: 3
1004f72a78684bbfcdc43ceeabb240ceee54706c4b0Guido van Rossumflags: 67
1014f72a78684bbfcdc43ceeabb240ceee54706c4b0Guido van Rossumconsts: ('None',)
1024f72a78684bbfcdc43ceeabb240ceee54706c4b0Guido van Rossum
1033e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton"""
1043e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
1053e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltondef consts(t):
1063e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton    """Yield a doctest-safe sequence of object reprs."""
1073e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton    for elt in t:
1083e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        r = repr(elt)
1093e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        if r.startswith("<code object"):
1103e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton            yield "<code object %s>" % elt.co_name
1113e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        else:
1123e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton            yield r
1133e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
1143e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltondef dump(co):
1153e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton    """Print out a text representation of a code object."""
1164f72a78684bbfcdc43ceeabb240ceee54706c4b0Guido van Rossum    for attr in ["name", "argcount", "kwonlyargcount", "names", "varnames",
1174f72a78684bbfcdc43ceeabb240ceee54706c4b0Guido van Rossum                 "cellvars", "freevars", "nlocals", "flags"]:
1183e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        print "%s: %s" % (attr, getattr(co, "co_" + attr))
1193e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton    print "consts:", tuple(consts(co.co_consts))
1203e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
1213e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltondef test_main(verbose=None):
1223e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton    from test.test_support import run_doctest
1233e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton    from test import test_code
1243e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton    run_doctest(test_code, verbose)
125