code: def getse(op, arg=None):
      
      try:
          return _se[op]
      except KeyError:
          # Continue to opcodes with an effect that depends on arg
          pass
  
      if arg is None:
          raise ValueError("Opcode stack behaviour depends on arg")
  
      def get_func_tup(arg, nextra):
          if arg > 0xFFFF:
              raise ValueError("Can only split a two-byte argument")
          return (nextra + 1 + (arg & 0xFF) + 2*((arg >> 8) & 0xFF),
                  1)
  
      if op == CALL_FUNCTION:
          return get_func_tup(arg, 0)
      elif op == CALL_FUNCTION_VAR:
          return get_func_tup(arg, 1)
      elif op == CALL_FUNCTION_KW:
          return get_func_tup(arg, 1)
      elif op == CALL_FUNCTION_VAR_KW:
          return get_func_tup(arg, 2)
  
      elif op == BUILD_TUPLE:
          return arg, 1
      elif op == BUILD_LIST:
          return arg, 1
      elif python_version == '2.7' and op == BUILD_SET:
          return arg, 1
      elif op == UNPACK_SEQUENCE:
          return 1, arg
      elif op == BUILD_SLICE:
          return arg, 1
      elif op == DUP_TOPX:
          return arg, arg*2
      elif op == RAISE_VARARGS:
          return 1+arg, 1
      elif op == MAKE_FUNCTION:
          return 1+arg, 1
      elif op == MAKE_CLOSURE:
          if python_version == '2.4':
              raise ValueError("The stack effect of MAKE_CLOSURE depends on TOS")
          else:
              return 2+arg, 1
      else:
          raise ValueError("The opcode %r isn't recognized or has a special "
                           "flow control" % op)
docs: Get the stack effect of an opcode, as a (pop, push) tuple.
  
      If an arg is needed and is not given, a ValueError is raised.
      If op isn't a simple opcode, that is, the flow doesn't always continue
      to the next opcode, a ValueError is raised.