"""Don't do this."""

import dis
import inspect

def caller_assignment_names(frame=None):
    if frame is None:
        frame = inspect.stack()[2][0]
    try:
        code, lasti = frame.f_code, frame.f_lasti
        bytecode = code.co_code[lasti:]
        return next_store_names(code, bytecode)
    finally:
        del frame

def next_store_names(code, bytecode):
    names = []
    idx, end = 0, len(bytecode)
    ea = 0
    while idx < end:
        op = ord(bytecode[idx])
        idx += 1
        if op >= dis.HAVE_ARGUMENT:
            oparg = ord(bytecode[idx]) + ord(bytecode[idx + 1]) * 256 + ea
            ea, idx = 0, idx + 2
            if op == dis.EXTENDED_ARG:
                ea = oparg * 65536L

            if op in (dis.opmap['CALL_FUNCTION'], dis.opmap['UNPACK_SEQUENCE']):
                continue
            if op != dis.opmap['STORE_NAME']:
                break

            if op not in (dis.opmap['UNPACK_SEQUENCE'],
                          dis.opmap['STORE_NAME'],
                          dis.opmap['CALL_FUNCTION']):
                break
            names.append(code.co_names[oparg])
    return names


if __name__ == '__main__':
    registry = dict(
        a='obj a',
        b='obj b',
        j='obj j',
        x='obj x',
        y='obj y',
        z='obj z')

    def lookup():
        names = caller_assignment_names()
        if len(names) == 1:
            return registry[names[0]]
        else:
            return tuple([registry[n] for n in names])


    (a, b) = lookup()
    print a, b

    j = lookup()
    print j

    x, y, z = lookup()
    print x, y, z

    e, f, g = lookup()
    # boom

