mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	 1aa4700234
			
		
	
	
		1aa4700234
		
	
	
	
	
		
			
			Most uses of PyCode_New found by http://www.google.com/codesearch?q=PyCode_New are trying to build an empty code object, usually to put it in a dummy frame object. This patch adds a PyCode_NewEmpty wrapper which lets the user specify just the filename, function name, and first line number, instead of also requiring lots of code internals.
		
			
				
	
	
		
			120 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
	
		
			2.3 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')
 | |
| 
 | |
| """
 | |
| 
 | |
| import unittest
 | |
| import _testcapi
 | |
| 
 | |
| 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))
 | |
| 
 | |
| 
 | |
| class CodeTest(unittest.TestCase):
 | |
| 
 | |
|     def test_newempty(self):
 | |
|         co = _testcapi.code_newempty("filename", "funcname", 15)
 | |
|         self.assertEquals(co.co_filename, "filename")
 | |
|         self.assertEquals(co.co_name, "funcname")
 | |
|         self.assertEquals(co.co_firstlineno, 15)
 | |
| 
 | |
| 
 | |
| def test_main(verbose=None):
 | |
|     from test.test_support import run_doctest, run_unittest
 | |
|     from test import test_code
 | |
|     run_doctest(test_code, verbose)
 | |
|     run_unittest(CodeTest)
 | |
| 
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|     test_main()
 |