import inspect from byteplay import Code, opmap LOAD_FAST = opmap['LOAD_FAST'] STORE_FAST = opmap['STORE_FAST'] LOAD_NAME = opmap['LOAD_NAME'] STORE_NAME = opmap['STORE_NAME'] LOAD_DEREF = opmap['LOAD_DEREF'] STORE_DEREF = opmap['STORE_DEREF'] def AnonymousCodeBlock(function): argSpec = inspect.getargspec(function) if [i for x in argSpec if x is not None for i in x]: raise TypeError("Function '%s' takes arguments" % function.func_name) code = Code.from_code(function.func_code) newBytecode = [] for opcode, arg in code.code: if opcode in (LOAD_FAST, LOAD_DEREF): opcode = LOAD_NAME elif opcode in (STORE_FAST, STORE_DEREF): opcode = STORE_NAME newBytecode.append((opcode, arg)) code.code = newBytecode code.newlocals = False code.freevars = () return code.to_code() def thunk(): print "In thunk" print x x = 45 def getThunk(): x = 1 z = 3 def innerThunk(): print 'In inner thunk' print x x = 7 print z return innerThunk def main(): x = 20 z = 10 codeObject = AnonymousCodeBlock(thunk) exec codeObject print x print exec AnonymousCodeBlock(getThunk()) print x if __name__ == '__main__': main() x = 5 z = 6 print print 'in local' exec AnonymousCodeBlock(getThunk()) print x