Remove uses of the string and types modules:

x in string.whitespace => x.isspace()
type(x) in types.StringTypes => isinstance(x, basestring)
isinstance(x, types.StringTypes) => isinstance(x, basestring)
type(x) is types.StringType => isinstance(x, str)
type(x) == types.StringType => isinstance(x, str)
string.split(x, ...) => x.split(...)
string.join(x, y) => y.join(x)
string.zfill(x, ...) => x.zfill(...)
string.count(x, ...) => x.count(...)
hasattr(types, "UnicodeType") => try: unicode except NameError:
type(x) != types.TupleTuple => not isinstance(x, tuple)
isinstance(x, types.TupleType) => isinstance(x, tuple)
type(x) is types.IntType => isinstance(x, int)

Do not mention the string module in the rlcompleter docstring.

This partially applies SF patch http://www.python.org/sf/562373
(with basestring instead of string). (It excludes the changes to
unittest.py and does not change the os.stat stuff.)
diff --git a/Lib/formatter.py b/Lib/formatter.py
index ccbbdf1..6ea5d9e 100644
--- a/Lib/formatter.py
+++ b/Lib/formatter.py
@@ -18,9 +18,7 @@
 manage and inserting data into the output.
 """
 
-import string
 import sys
-from types import StringType
 
 
 AS_IS = None
@@ -119,7 +117,7 @@
             self.writer.send_line_break()
         if not self.para_end:
             self.writer.send_paragraph((blankline and 1) or 0)
-        if type(format) is StringType:
+        if isinstance(format, str):
             self.writer.send_label_data(self.format_counter(format, counter))
         else:
             self.writer.send_label_data(format)
@@ -176,16 +174,13 @@
             return label.upper()
         return label
 
-    def add_flowing_data(self, data,
-                         # These are only here to load them into locals:
-                         whitespace = string.whitespace,
-                         join = string.join, split = string.split):
+    def add_flowing_data(self, data):
         if not data: return
         # The following looks a bit convoluted but is a great improvement over
         # data = regsub.gsub('[' + string.whitespace + ']+', ' ', data)
-        prespace = data[:1] in whitespace
-        postspace = data[-1:] in whitespace
-        data = join(split(data))
+        prespace = data[:1].isspace()
+        postspace = data[-1:].isspace()
+        data = " ".join(data.split())
         if self.nospace and not data:
             return
         elif prespace or self.softspace:
@@ -411,7 +406,7 @@
 
     def send_flowing_data(self, data):
         if not data: return
-        atbreak = self.atbreak or data[0] in string.whitespace
+        atbreak = self.atbreak or data[0].isspace()
         col = self.col
         maxcol = self.maxcol
         write = self.file.write
@@ -427,7 +422,7 @@
             col = col + len(word)
             atbreak = 1
         self.col = col
-        self.atbreak = data[-1] in string.whitespace
+        self.atbreak = data[-1].isspace()
 
 
 def test(file = None):