code: def disassembler(co, lasti= -1):
      
  
      code = co.co_code
      labels = dis.findlabels(code)
      linestarts = dict(dis.findlinestarts(co))
      i = 0
      extended_arg = 0
      lineno = 0
      free = None
      for i, op, oparg in _walk_ops(co):
          if i in linestarts:
              lineno = linestarts[i]
          instr = Instruction(i=i, op=op, lineno=lineno)
          instr.linestart = i in linestarts
  
          if i == lasti:
              instr.lasti = True
          else:
              instr.lasti = False
  
          if i in labels:
              instr.label = True
          else:
              instr.label = False
  
          instr.oparg = oparg
          extended_arg = 0
          if op == dis.EXTENDED_ARG:
              extended_arg = oparg * 65536
          instr.extended_arg = extended_arg
          if op >= dis.HAVE_ARGUMENT:
              if op in dis.hasconst:
                  instr.arg = co.co_consts[oparg]
              elif op in dis.hasname:
                  instr.arg = co.co_names[oparg]
              elif op in dis.hasjrel:
                  instr.arg = i + oparg
              elif op in dis.haslocal:
                  instr.arg = co.co_varnames[oparg]
              elif op in dis.hascompare:
                  instr.arg = dis.cmp_op[oparg]
              elif op in dis.hasfree:
                  if free is None:
                      free = co.co_cellvars + co.co_freevars
                  instr.arg = free[oparg]
  
          yield instr
docs: Disassemble a code object. 
      
      :param co: code object
      :param lasti: internal
      :yields: Instructions.