import types
def inv(fn):
import types
import dis
t=fn.__code__
c=list(t.co_code)
idxs=[]
i=0
n=len(c)
lc=dis.opmap['LOAD_CONST']
while i<n:
opcode=ord(c[i])
if opcode==lc and c[i+1]!='\0':
idxs+=[i+1]
i+=1
if opcode>=dis.HAVE_ARGUMENT:
i+=2
for i in range(len(idxs)/2):
c[idxs[i]], c[idxs[-i-1]] = c[idxs[-i-1]], c[idxs[i]]
outcode=types.CodeType( t.co_argcount, t.co_nlocals, t.co_stacksize, t.co_flags, ''.join(c), t.co_consts, t.co_names, t.co_varnames, t.co_filename, t.co_name, t.co_firstlineno, t.co_lnotab)
return types.FunctionType(outcode, globals(), fn.__name__[::-1])
@inv
def f():
print 'Line1'
print 'Line2'
print 'Line3'
print 'Line4'
f()
aW1wb3J0IHR5cGVzCgogICAgCmRlZiBpbnYoZm4pOgogICAgaW1wb3J0IHR5cGVzCiAgICBpbXBvcnQgZGlzCgogICAgdD1mbi5fX2NvZGVfXwogICAgYz1saXN0KHQuY29fY29kZSkKCiAgICBpZHhzPVtdCiAgICBpPTAKICAgIG49bGVuKGMpCiAgICBsYz1kaXMub3BtYXBbJ0xPQURfQ09OU1QnXQoKICAgIHdoaWxlIGk8bjoKICAgICAgICBvcGNvZGU9b3JkKGNbaV0pCiAgICAgICAgaWYgb3Bjb2RlPT1sYyBhbmQgY1tpKzFdIT0nXDAnOgogICAgICAgICAgICBpZHhzKz1baSsxXQogICAgICAgIGkrPTEKICAgICAgICBpZiBvcGNvZGU+PWRpcy5IQVZFX0FSR1VNRU5UOgogICAgICAgICAgICBpKz0yCgogICAgZm9yIGkgaW4gcmFuZ2UobGVuKGlkeHMpLzIpOgogICAgICAgIGNbaWR4c1tpXV0sIGNbaWR4c1staS0xXV0gPSBjW2lkeHNbLWktMV1dLCBjW2lkeHNbaV1dCiAgICBvdXRjb2RlPXR5cGVzLkNvZGVUeXBlKCB0LmNvX2FyZ2NvdW50LCB0LmNvX25sb2NhbHMsIHQuY29fc3RhY2tzaXplLCB0LmNvX2ZsYWdzLCAnJy5qb2luKGMpLCB0LmNvX2NvbnN0cywgdC5jb19uYW1lcywgdC5jb192YXJuYW1lcywgdC5jb19maWxlbmFtZSwgdC5jb19uYW1lLCB0LmNvX2ZpcnN0bGluZW5vLCB0LmNvX2xub3RhYikKICAgIHJldHVybiB0eXBlcy5GdW5jdGlvblR5cGUob3V0Y29kZSwgZ2xvYmFscygpLCBmbi5fX25hbWVfX1s6Oi0xXSkKCkBpbnYKZGVmIGYoKToKICAgIHByaW50ICdMaW5lMScKICAgIHByaW50ICdMaW5lMicKICAgIHByaW50ICdMaW5lMycKICAgIHByaW50ICdMaW5lNCcKCmYoKQo=