def testFilenameAndOffset(self): src = u"a=1\nraise RuntimeError" globs = {} co = compile_function(src, "foo.py", "func_name", ["x", "y", "z"], lineno=100) exec co in globs f = globs['func_name'] # re-create the function - so we can bind to different globals # Note we need to manually setup __builtins__ for this new globs. globs = { 'g': 'call_globs', '__debug__': __debug__, "__builtins__": globs["__builtins__"] } f = new.function(f.func_code, globs, f.func_name) try: f(1, 2, 3) raise AssertionError, "not reached!" except RuntimeError: # The function line number is 1 frames back. It should point to # line 102 tb = sys.exc_info()[2].tb_next self.failUnlessEqual(tb.tb_frame.f_lineno, 102) self.failUnlessEqual(tb.tb_frame.f_code.co_filename, "foo.py")
def testFunction(self): # Compile a test function, then execute it. src = u"assert g=='call_globs'\nreturn 'wow'" globs = {"g": "compile_globs"} co = compile_function(src, "foo.py", "func_name", ["x", "y", "z"], lineno=100) exec co in globs f = globs["func_name"] # re-create the function - so we can bind to different globals globs = {"g": "call_globs", "__debug__": __debug__} f = new.function(f.func_code, globs, f.func_name) self.failUnlessEqual(f(1, 2, 3), "wow")
def testFunctionArgs(self): # Compile a test function, then execute it. src = u"assert a==1\nassert b=='b'\nassert c is None\nreturn 'yes'" defs = (1, "b", None) co = compile_function(src, "foo.py", "func_name", ["a", "b", "c"], defs, lineno=100) globs = {} exec co in globs f = globs["func_name"] # re-create the function - so we can bind to different globals globs = {"__debug__": __debug__} f = new.function(f.func_code, globs, f.func_name, defs) self.failUnlessEqual(f(), "yes")
def testFunction(self): # Compile a test function, then execute it. src = u"assert g=='call_globs'\nreturn 'wow'" globs = {'g': 'compile_globs'} co = compile_function(src, "foo.py", "func_name", ["x", "y", "z"], lineno=100) exec co in globs f = globs['func_name'] # re-create the function - so we can bind to different globals globs = {'g': 'call_globs', '__debug__': __debug__} f = new.function(f.func_code, globs, f.func_name) self.failUnlessEqual(f(1, 2, 3), 'wow')
def testFunctionArgs(self): # Compile a test function, then execute it. src = u"assert a==1\nassert b=='b'\nassert c is None\nreturn 'yes'" defs = (1, "b", None) co = compile_function(src, "foo.py", "func_name", ["a", "b", "c"], defs, lineno=100) globs = {} exec co in globs f = globs['func_name'] # re-create the function - so we can bind to different globals globs = {'__debug__': __debug__} f = new.function(f.func_code, globs, f.func_name, defs) self.failUnlessEqual(f(), 'yes')
def testFilenameAndOffset(self): src = u"a=1\nraise RuntimeError" globs = {} co = compile_function(src, "foo.py", "func_name", ["x", "y", "z"], lineno=100) exec co in globs f = globs["func_name"] # re-create the function - so we can bind to different globals # Note we need to manually setup __builtins__ for this new globs. globs = {"g": "call_globs", "__debug__": __debug__, "__builtins__": globs["__builtins__"]} f = new.function(f.func_code, globs, f.func_name) try: f(1, 2, 3) raise AssertionError, "not reached!" except RuntimeError: # The function line number is 1 frames back. It should point to # line 102 tb = sys.exc_info()[2].tb_next self.failUnlessEqual(tb.tb_frame.f_lineno, 102) self.failUnlessEqual(tb.tb_frame.f_code.co_filename, "foo.py")