code: def remove_comments(tokens):
      
      preserved_shebang = ""
      preserved_encoding = ""
      # This (short) loop preserves shebangs and encoding strings:
      for tok in tokens[0:4]: # Will always be in the first four tokens
          line = tok[4]
          # Save the first comment line if it starts with a shebang
          # (e.g. '#!/usr/bin/env python')
          if analyze.shebang.match(line): # Must be first line
              preserved_shebang = line
          # Save the encoding string (must be first or second line in file)
          # (e.g. '# -*- coding: utf-8 -*-')
          elif analyze.encoding.match(line):
              preserved_encoding = line
      # Now remove comments:
      prev_tok_type = 0
      for index, tok in enumerate(tokens):
          token_type = tok[0]
          if token_type == tokenize.COMMENT:
              tokens[index][1] = '' # Making it an empty string removes it
          # TODO: Figure out a way to make this work
          #elif prev_tok_type == tokenize.COMMENT:
              #if token_type == tokenize.NL:
                  #tokens[index][1] = '' # Remove trailing newline
          prev_tok_type = token_type
      # Prepend our preserved items back into the token list:
      if preserved_shebang: # Have to re-tokenize them
          io_obj = io.StringIO(preserved_shebang + preserved_encoding)
          preserved = [list(a) for a in tokenize.generate_tokens(io_obj.readline)]
          preserved.pop() # Get rid of ENDMARKER
          preserved.reverse() # Round and round we go!
          for item in preserved:
              tokens.insert(0, item)
docs: Removes comments from *tokens* which is expected to be a list equivalent of
      tokenize.generate_tokens() (so we can update in-place).
  
      .. note::
  
          * If the comment makes up the whole line, the newline will also be removed (so you don't end up with lots of blank lines).
          * Preserves shebangs and encoding strings.