nodes: 0, module; 1, function_definition; 2, function_name:_sanitize_usecols; 3, parameters; 4, block; 5, identifier:usecols; 6, expression_statement; 7, if_statement; 8, try_statement; 9, expression_statement; 10, for_statement; 11, comment:# Remove duplicates:; 12, expression_statement; 13, expression_statement; 14, return_statement; 15, comment:"""Make a tuple of sorted integers and return it. Return None if
      usecols is None"""; 16, comparison_operator:usecols is None; 17, block; 18, block; 19, except_clause; 20, assignment; 21, identifier:pat; 22, identifier:pats; 23, block; 24, assignment; 25, call; 26, call; 27, identifier:usecols; 28, None; 29, return_statement; 30, expression_statement; 31, expression_statement; 32, identifier:AttributeError; 33, block; 34, identifier:cols; 35, list; 36, if_statement; 37, identifier:cols; 38, call; 39, attribute; 40, argument_list; 41, identifier:tuple; 42, argument_list; 43, None; 44, assignment; 45, assignment; 46, expression_statement; 47, comment:# Make error if mix.; 48, expression_statement; 49, return_statement; 50, comment:# Assume sane sequence of integers.; 51, comparison_operator:':' in pat; 52, block; 53, else_clause; 54, identifier:list; 55, argument_list; 56, identifier:cols; 57, identifier:sort; 58, identifier:cols; 59, identifier:pats; 60, call; 61, identifier:pats; 62, list_comprehension; 63, assignment; 64, call; 65, call; 66, string; 67, identifier:pat; 68, expression_statement; 69, expression_statement; 70, expression_statement; 71, expression_statement; 72, block; 73, call; 74, attribute; 75, argument_list; 76, call; 77, for_in_clause; 78, if_clause; 79, identifier:usecols; 80, list_comprehension; 81, attribute; 82, argument_list; 83, identifier:tuple; 84, argument_list; 85, string_content::; 86, assignment; 87, assignment; 88, assignment; 89, augmented_assignment; 90, expression_statement; 91, identifier:set; 92, argument_list; 93, identifier:usecols; 94, identifier:split; 95, string; 96, attribute; 97, argument_list; 98, identifier:p; 99, identifier:pats; 100, identifier:p; 101, call; 102, for_in_clause; 103, identifier:usecols; 104, identifier:sort; 105, identifier:usecols; 106, pattern_list; 107, call; 108, identifier:n1; 109, call; 110, identifier:n2; 111, call; 112, identifier:cols; 113, call; 114, augmented_assignment; 115, identifier:cols; 116, string_content:,; 117, identifier:p; 118, identifier:strip; 119, identifier:int; 120, argument_list; 121, identifier:c; 122, identifier:usecols; 123, identifier:c1; 124, identifier:c2; 125, attribute; 126, argument_list; 127, identifier:letter2num; 128, argument_list; 129, identifier:letter2num; 130, argument_list; 131, identifier:range; 132, argument_list; 133, identifier:cols; 134, list; 135, identifier:c; 136, identifier:pat; 137, identifier:split; 138, string; 139, identifier:c1; 140, keyword_argument; 141, identifier:c2; 142, keyword_argument; 143, identifier:n1; 144, identifier:n2; 145, call; 146, string_content::; 147, identifier:zbase; 148, True; 149, identifier:zbase; 150, False; 151, identifier:letter2num; 152, argument_list; 153, identifier:pat; 154, keyword_argument; 155, identifier:zbase; 156, True
code: def _sanitize_usecols(usecols):
      """Make a tuple of sorted integers and return it. Return None if
      usecols is None"""
  
      if usecols is None:
          return None
  
      try:
          pats = usecols.split(',')
          pats = [p.strip() for p in pats if p]
      except AttributeError:
          usecols = [int(c) for c in usecols]  # Make error if mix.
          usecols.sort()
          return tuple(usecols)   # Assume sane sequence of integers.
  
      cols = []
      for pat in pats:
          if ':' in pat:
              c1, c2 = pat.split(':')
              n1 = letter2num(c1, zbase=True)
              n2 = letter2num(c2, zbase=False)
              cols += range(n1, n2)
          else:
              cols += [letter2num(pat, zbase=True)]
  
      # Remove duplicates:
      cols = list(set(cols))
      cols.sort()
      return tuple(cols)