getBytesIO/getStringIO are now unneeded

Claude Paroz <[email protected]> Mon, 14 Feb 2022 17:34:22 +0100
Newsgroups gmane.comp.python.reportlab.user
Message-ID <[email protected]>
Hi,

The attached patch is avoiding calling the getBytesIO()/getStringIO() 
proxy functions, which looks like there are no longer useful as 
BytesIO()/StringIO() can be called directly.

Cheers,

Claude
-- 
www.2xlibre.net
0001-Removed-getBytesIO-getStringIO-proxies-to-BytesIO-St.patch (text/x-patch, 28 KB)
From bba64a3af07e2150cbdfc6ebf7638f8a75422c46 Mon Sep 17 00:00:00 2001
From: Claude Paroz <[email protected]>
Date: Fri, 4 Feb 2022 15:10:59 +0100
Subject: [PATCH] Removed getBytesIO/getStringIO proxies to BytesIO/StringIO

---
 demos/rlzope/rlzope.py               | 11 +++++-----
 src/reportlab/graphics/renderPDF.py  |  5 +++--
 src/reportlab/graphics/renderPM.py   |  9 ++++----
 src/reportlab/graphics/renderPS.py   | 11 +++++-----
 src/reportlab/graphics/renderSVG.py  |  9 ++++----
 src/reportlab/graphics/testshapes.py |  4 ++--
 src/reportlab/lib/pdfencrypt.py      |  6 ++++--
 src/reportlab/lib/pygments2xpre.py   |  5 +++--
 src/reportlab/lib/utils.py           | 31 ++++++++--------------------
 src/reportlab/pdfbase/pdfutils.py    |  6 ++++--
 src/reportlab/pdfbase/ttfonts.py     |  5 +++--
 src/reportlab/pdfgen/pdfimages.py    |  2 +-
 tests/test_lib_utils.py              |  5 +++--
 tests/test_pdfbase_ttfonts.py        | 25 +++++++++++-----------
 tests/test_pdfgen_general.py         |  5 ++---
 tools/docco/graphdocpy.py            |  6 +++---
 tools/pythonpoint/pythonpoint.py     |  7 ++++---
 17 files changed, 76 insertions(+), 76 deletions(-)

diff --git a/demos/rlzope/rlzope.py b/demos/rlzope/rlzope.py
index fc1d9217..17954a51 100644
--- a/demos/rlzope/rlzope.py
+++ b/demos/rlzope/rlzope.py
@@ -12,18 +12,19 @@
 #
 #
 
+from io import BytesIO
 try :
     from Shared.reportlab.platypus.paragraph import Paragraph
     from Shared.reportlab.platypus.doctemplate import *
     from Shared.reportlab.lib.units import inch
     from Shared.reportlab.lib import styles
-    from Shared.reportlab.lib.utils import ImageReader, getBytesIO
+    from Shared.reportlab.lib.utils import ImageReader
 except ImportError :
     from reportlab.platypus.paragraph import Paragraph
     from reportlab.platypus.doctemplate import *
     from reportlab.lib.units import inch
     from reportlab.lib import styles
-    from reportlab.lib.utils import ImageReader, getBytesIO
+    from reportlab.lib.utils import ImageReader
 
 class MyPDFDoc :
     class MyPageTemplate(PageTemplate) :
@@ -54,7 +55,7 @@ class MyPDFDoc :
                 return None
 
             # Convert it to PIL
-            image = ImageReader(getBytesIO(str(logo.data)))
+            image = ImageReader(BytesIO(logo.data))
             (width, height) = image.getSize()
 
             # scale it to be 0.75 inch high
@@ -83,7 +84,7 @@ class MyPDFDoc :
 
         # we will build an in-memory document
         # instead of creating an on-disk file.
-        self.report = getBytesIO()
+        self.report = BytesIO()
 
         # initialise a PDF document using ReportLab's platypus
         self.document = BaseDocTemplate(self.report)
@@ -157,7 +158,7 @@ def rlzope(self) :
         self.REQUEST.RESPONSE.setHeader('Content-Disposition', 'attachment; filename=%s' % filename)
     except:
         import traceback, sys, cgi
-        content = sys.stdout = sys.stderr = getBytesIO()
+        content = sys.stdout = sys.stderr = BytesIO()
         self.REQUEST.RESPONSE.setHeader('Content-Type', 'text/html')
         traceback.print_exc()
         sys.stdout = sys.__stdout__
diff --git a/src/reportlab/graphics/renderPDF.py b/src/reportlab/graphics/renderPDF.py
index bfe07d1e..dc6aa062 100644
--- a/src/reportlab/graphics/renderPDF.py
+++ b/src/reportlab/graphics/renderPDF.py
@@ -15,10 +15,11 @@ Execute the script to see some test drawings.
 changed
 """
 
+from io import BytesIO
+
 from reportlab.graphics.shapes import *
 from reportlab.pdfgen.canvas import Canvas
 from reportlab.pdfbase.pdfmetrics import stringWidth
-from reportlab.lib.utils import getBytesIO
 from reportlab import rl_config
 from reportlab.graphics.renderbase import Renderer, StateTracker, getStateDelta, renderScaledDrawing, STATE_DEFAULTS
 
@@ -322,7 +323,7 @@ def drawToFile(d, fn, msg="", showBoundary=rl_config._unset_, autoSize=1, canvas
 
 def drawToString(d, msg="", showBoundary=rl_config._unset_,autoSize=1,canvasKwds={}):
     "Returns a PDF as a string in memory, without touching the disk"
-    s = getBytesIO()
+    s = BytesIO()
     drawToFile(d, s, msg=msg, showBoundary=showBoundary,autoSize=autoSize, canvasKwds=canvasKwds)
     return s.getvalue()
 
diff --git a/src/reportlab/graphics/renderPM.py b/src/reportlab/graphics/renderPM.py
index d666ffa2..650c2d9f 100644
--- a/src/reportlab/graphics/renderPM.py
+++ b/src/reportlab/graphics/renderPM.py
@@ -16,11 +16,12 @@ from reportlab.graphics.shapes import *
 from reportlab.graphics.renderbase import StateTracker, getStateDelta, renderScaledDrawing
 from reportlab.pdfbase.pdfmetrics import getFont, unicode2T1
 from math import sin, cos, pi, ceil
-from reportlab.lib.utils import getStringIO, getBytesIO, open_and_read, isUnicode
+from reportlab.lib.utils import open_and_read, isUnicode
 from reportlab import rl_config
 from .utils import setFont as _setFont, RenderPMError
 
 import os, sys
+from io import BytesIO, StringIO
 
 try:
     from reportlab.graphics import _renderPM
@@ -384,7 +385,7 @@ class PMCanvas:
             markfilename(fn,ext=fmt)
 
     def saveToString(self,fmt='GIF'):
-        s = getBytesIO()
+        s = BytesIO()
         self.saveToFile(s,fmt=fmt)
         return s.getvalue()
 
@@ -693,7 +694,7 @@ def drawToFile(d,fn,fmt='GIF', dpi=72, bg=0xffffff, configPIL=None, showBoundary
     c.saveToFile(fn,fmt)
 
 def drawToString(d,fmt='GIF', dpi=72, bg=0xffffff, configPIL=None, showBoundary=rl_config._unset_,backend=rl_config.renderPMBackend):
-    s = getBytesIO()
+    s = BytesIO()
     drawToFile(d,s,fmt=fmt, dpi=dpi, bg=bg, configPIL=configPIL,backend=backend)
     return s.getvalue()
 
@@ -737,7 +738,7 @@ def test(outDir='pmout', shout=False):
         msg = 'Problem drawing %s fmt=%s file'%(name,fmt)
         if shout or verbose>2: print(msg)
         errs.append('<br/><h2 style="color:red">%s</h2>' % msg)
-        buf = getStringIO()
+        buf = StringIO()
         traceback.print_exc(file=buf)
         errs.append('<pre>%s</pre>' % escape(buf.getvalue()))
 
diff --git a/src/reportlab/graphics/renderPS.py b/src/reportlab/graphics/renderPS.py
index 5a159f12..17592917 100644
--- a/src/reportlab/graphics/renderPS.py
+++ b/src/reportlab/graphics/renderPS.py
@@ -5,12 +5,13 @@ __version__='3.3.0'
 __doc__="""Render drawing objects in Postscript"""
 
 from reportlab.pdfbase.pdfmetrics import getFont, stringWidth, unicode2T1 # for font info
-from reportlab.lib.utils import getBytesIO, getStringIO, asBytes, char2int, rawBytes, asNative, isUnicode
+from reportlab.lib.utils import asBytes, char2int, rawBytes, asNative, isUnicode
 from reportlab.lib.rl_accel import fp_str
 from reportlab.lib.colors import black
 from reportlab.graphics.renderbase import Renderer, StateTracker, getStateDelta, renderScaledDrawing
 from reportlab.graphics.shapes import STATE_DEFAULTS
 import math
+from io import BytesIO, StringIO
 from operator import getitem
 from reportlab import rl_config
 from reportlab.pdfgen.canvas import FILL_EVEN_ODD, FILL_NON_ZERO
@@ -618,7 +619,7 @@ class PSCanvas:
         hex_encoded = self._AsciiHexEncode(rawimage)
 
         # write in blocks of 78 chars per line
-        outstream = getStringIO(hex_encoded)
+        outstream = StringIO(hex_encoded)
 
         dataline = outstream.read(78)
         while dataline != "":
@@ -630,7 +631,7 @@ class PSCanvas:
     # end of drawImage
     def _AsciiHexEncode(self, input):  # also based on piddlePDF
         "Helper function used by images"
-        output = getStringIO()
+        output = StringIO()
         for char in asBytes(input):
             output.write('%02x' % char2int(char))
         return output.getvalue()
@@ -686,7 +687,7 @@ class PSCanvas:
         hex_encoded = self._AsciiHexEncode(rawimage)
 
         # write in blocks of 78 chars per line
-        outstream = getStringIO(hex_encoded)
+        outstream = StringIO(hex_encoded)
 
         dataline = outstream.read(78)
         while dataline != "":
@@ -925,7 +926,7 @@ def drawToFile(d,fn, showBoundary=rl_config.showBoundary,**kwd):
 
 def drawToString(d, showBoundary=rl_config.showBoundary):
     "Returns a PS as a string in memory, without touching the disk"
-    s = getBytesIO()
+    s = BytesIO()
     drawToFile(d, s, showBoundary=showBoundary)
     return s.getvalue()
 
diff --git a/src/reportlab/graphics/renderSVG.py b/src/reportlab/graphics/renderSVG.py
index f709c776..c895a79e 100644
--- a/src/reportlab/graphics/renderSVG.py
+++ b/src/reportlab/graphics/renderSVG.py
@@ -8,17 +8,18 @@ objects download the svglib module here:
 """
 
 import math, types, sys, os, codecs, base64
+from io import BytesIO, StringIO
 from operator import getitem
 
 from reportlab.pdfbase.pdfmetrics import stringWidth # for font info
 from reportlab.lib.rl_accel import fp_str
 from reportlab.lib.colors import black
-from reportlab.lib.utils import asNative, getBytesIO
+from reportlab.lib.utils import asNative
 from reportlab.graphics.renderbase import StateTracker, getStateDelta, Renderer, renderScaledDrawing
 from reportlab.graphics.shapes import STATE_DEFAULTS, Path, UserNode
 from reportlab.graphics.shapes import * # (only for test0)
 from reportlab import rl_config
-from reportlab.lib.utils import getStringIO, RLString, isUnicode, isBytes
+from reportlab.lib.utils import RLString, isUnicode, isBytes
 from reportlab.pdfgen.canvas import FILL_EVEN_ODD, FILL_NON_ZERO
 from .renderPM import _getImage
 
@@ -39,7 +40,7 @@ EXTRA_FILL_STYLES = 'fill fill-opacity'.split()
 ### top-level user function ###
 def drawToString(d, showBoundary=rl_config.showBoundary,**kwds):
     "Returns a SVG as a string in memory, without touching the disk"
-    s = getStringIO()
+    s = StringIO()
     drawToFile(d, s, showBoundary=showBoundary,**kwds)
     return s.getvalue()
 
@@ -521,7 +522,7 @@ class SVGCanvas:
         # self.currGroup.appendChild(comment)
 
     def drawImage(self, image, x, y, width, height, embed=True):
-        buf = getBytesIO()
+        buf = BytesIO()
         image.save(buf,'png')
         buf = asNative(base64.b64encode(buf.getvalue()))
         self.currGroup.appendChild(
diff --git a/src/reportlab/graphics/testshapes.py b/src/reportlab/graphics/testshapes.py
index c617a2fb..c33cb667 100644
--- a/src/reportlab/graphics/testshapes.py
+++ b/src/reportlab/graphics/testshapes.py
@@ -16,6 +16,7 @@ Feel free to add more.
 '''
 
 import os, sys, base64
+from io import BytesIO
 
 from reportlab.lib import colors
 from reportlab.lib.units import cm
@@ -455,11 +456,10 @@ def getDrawing13():
 def smallArrow():
     '''create a small PIL image'''
     from reportlab.graphics.renderPM import _getImage
-    from reportlab.lib.utils import getBytesIO
     b = base64_decodebytes(b'''R0lGODdhCgAHAIMAAP/////29v/d3f+ysv9/f/9VVf9MTP8iIv8ICP8AAAAAAAAAAAAAAAAAAAAA
 AAAAACwAAAAACgAHAAAIMwABCBxIsKABAQASFli4MAECAgEAJJhIceKBAQkyasx4YECBjx8TICAQ
 AIDJkwYEAFgZEAA7''')
-    return _getImage().open(getBytesIO(b))
+    return _getImage().open(BytesIO(b))
 
 def getDrawing14():
     '''test shapes.Image'''
diff --git a/src/reportlab/lib/pdfencrypt.py b/src/reportlab/lib/pdfencrypt.py
index d1d0b0fb..787ca6a6 100644
--- a/src/reportlab/lib/pdfencrypt.py
+++ b/src/reportlab/lib/pdfencrypt.py
@@ -5,7 +5,9 @@ __version__='3.3.0'
 """helpers for pdf encryption/decryption"""
 import sys, os, tempfile
 from binascii import hexlify, unhexlify
-from reportlab.lib.utils import getBytesIO, md5, asBytes, int2Byte, char2int, rawUnicode, rawBytes, asNative
+from io import BytesIO
+
+from reportlab.lib.utils import md5, asBytes, int2Byte, char2int, rawUnicode, rawBytes, asNative
 from reportlab.pdfgen.canvas import Canvas
 from reportlab.pdfbase import pdfutils
 from reportlab.pdfbase.pdfdoc import PDFObject
@@ -558,7 +560,7 @@ See https://www.reportlab.com/downloads''')
     firstPageSize = bboxInfo['PageForms0'][2:]
 
     #now make a new PDF document
-    buf = getBytesIO()
+    buf = BytesIO()
     canv = Canvas(buf, pagesize=firstPageSize)
 
     # set a standard ID while debugging
diff --git a/src/reportlab/lib/pygments2xpre.py b/src/reportlab/lib/pygments2xpre.py
index 0310d80d..f1048d4c 100644
--- a/src/reportlab/lib/pygments2xpre.py
+++ b/src/reportlab/lib/pygments2xpre.py
@@ -9,8 +9,9 @@ For a list of available lexers see http://pygments.org/docs/
 
 """
 __all__ = ('pygments2xpre',)
-from reportlab.lib.utils import asBytes, getBytesIO, getStringIO, asUnicode, isUnicode
+from reportlab.lib.utils import asBytes, asUnicode, isUnicode
 import re
+from io import StringIO
 
 def _2xpre(s,styles):
     "Helper to transform Pygments HTML output to ReportLab markup"
@@ -34,7 +35,7 @@ def pygments2xpre(s, language="python"):
 
     from pygments.lexers import get_lexer_by_name
     rconv = lambda x: x
-    out = getStringIO()
+    out = StringIO()
 
     l = get_lexer_by_name(language)
     
diff --git a/src/reportlab/lib/utils.py b/src/reportlab/lib/utils.py
index c14e7a09..5fccfd90 100644
--- a/src/reportlab/lib/utils.py
+++ b/src/reportlab/lib/utils.py
@@ -6,6 +6,7 @@ __doc__='''Gazillions of miscellaneous internal utility functions'''
 
 import os, pickle, sys, time, types, datetime, ast, importlib
 from functools import reduce as functools_reduce
+from io import BytesIO
 literal_eval = ast.literal_eval
 try:
     from base64 import decodebytes as base64_decodebytes, encodebytes as base64_encodebytes
@@ -115,20 +116,6 @@ def instantiated(v):
 
 from string import ascii_letters, ascii_uppercase, ascii_lowercase
 
-from io import BytesIO, StringIO
-def getBytesIO(buf=None):
-    '''unified StringIO instance interface'''
-    if buf:
-        return BytesIO(buf)
-    return BytesIO()
-_bytesIOType = BytesIO 
-
-def getStringIO(buf=None):
-    '''unified StringIO instance interface'''
-    if buf:
-        return StringIO(buf)
-    return StringIO()
-
 def bytestr(x,enc='utf8'):
     if isinstance(x,str):
         return x.encode(enc)
@@ -510,7 +497,7 @@ def open_for_read_by_name(name,mode='b'):
         name = _startswith_rl(name)
         s = __rl_loader__.get_data(name)
         if 'b' not in mode and os.linesep!='\n': s = s.replace(os.linesep,'\n')
-        return getBytesIO(s)
+        return BytesIO(s)
 
 from urllib.parse import unquote, urlparse
 from urllib.request import urlopen
@@ -569,7 +556,7 @@ def open_for_read(name,mode='b'):
                     purl = urlparse(name)
                     if purl[0] and not ((purl[0] in ('data','file') or trustedHosts.match(purl[1])) and (purl[0] in trustedSchemes)):
                         raise ValueError('Attempted untrusted host access')
-                return getBytesIO((datareader if name[:5].lower()=='data:' else rlUrlRead)(name))
+                return BytesIO((datareader if name[:5].lower()=='data:' else rlUrlRead)(name))
             except:
                 raise IOError('Cannot open resource "%s"' % name)
     globals()['open_for_read'] = open_for_read
@@ -681,7 +668,7 @@ class ImageReader:
             try:
                 from reportlab.rl_config import imageReaderFlags
                 self.fp = open_for_read(fileName,'b')
-                if isinstance(self.fp,_bytesIOType): imageReaderFlags=0 #avoid messing with already internal files
+                if isinstance(self.fp, BytesIO): imageReaderFlags=0 #avoid messing with already internal files
                 if imageReaderFlags>0:  #interning
                     data = self.fp.read()
                     if imageReaderFlags&2:  #autoclose
@@ -694,7 +681,7 @@ class ImageReader:
                             from rl_config import register_reset
                             register_reset(self._cache.clear)
                         data=self._cache.setdefault(_digester(data),data)
-                    self.fp=getBytesIO(data)
+                    self.fp=BytesIO(data)
                 elif imageReaderFlags==-1 and isinstance(fileName,str):
                     #try Ralf Schmitt's re-opening technique of avoiding too many open files
                     self.fp.close()
@@ -866,7 +853,7 @@ class DebugMemo:
         self.store = store = {}
         if capture_traceback and sys.exc_info() != (None,None,None):
             import traceback
-            s = getBytesIO()
+            s = BytesIO()
             traceback.print_exc(None,s)
             store['__traceback'] = s.getvalue()
         cwd=os.getcwd()
@@ -957,7 +944,7 @@ class DebugMemo:
             pickle.dump(self.store,f)
         except:
             S=self.store.copy()
-            ff=getBytesIO()
+            ff=BytesIO()
             for k,v in S.items():
                 try:
                     pickle.dump({k:v},ff)
@@ -974,7 +961,7 @@ class DebugMemo:
             f.close()
 
     def dumps(self):
-        f = getBytesIO()
+        f = BytesIO()
         self._dump(f)
         return f.getvalue()
 
@@ -989,7 +976,7 @@ class DebugMemo:
             f.close()
 
     def loads(self,s):
-        self._load(getBytesIO(s))
+        self._load(BytesIO(s))
 
     def _show_module_versions(self,k,v):
         self._writeln(k[2:])
diff --git a/src/reportlab/pdfbase/pdfutils.py b/src/reportlab/pdfbase/pdfutils.py
index 775b246e..c61f8726 100755
--- a/src/reportlab/pdfbase/pdfutils.py
+++ b/src/reportlab/pdfbase/pdfutils.py
@@ -9,8 +9,10 @@ __doc__=''
 import sys
 import os
 import binascii
+from io import BytesIO
+
 from reportlab import rl_config
-from reportlab.lib.utils import getBytesIO, ImageReader, isUnicode
+from reportlab.lib.utils import ImageReader, isUnicode
 from reportlab.lib.rl_accel import asciiBase85Encode, asciiBase85Decode
 
 def _chunker(src,dst=[],chunkSize=60):
@@ -172,7 +174,7 @@ def _AsciiHexEncode(input):
     Helper function used by images."""
     if isUnicode(input):
         input = input.encode('utf-8')
-    output = getBytesIO()
+    output = BytesIO()
     output.write(binascii.b2a_hex(input))
     output.write(b'>')
     return output.getvalue()
diff --git a/src/reportlab/pdfbase/ttfonts.py b/src/reportlab/pdfbase/ttfonts.py
index f3d303d9..4fe935a8 100644
--- a/src/reportlab/pdfbase/ttfonts.py
+++ b/src/reportlab/pdfbase/ttfonts.py
@@ -52,11 +52,12 @@ Canvas and TextObject have special support for dynamic fonts.
 """
 
 from struct import pack, unpack, error as structError
-from reportlab.lib.utils import getBytesIO, bytestr, isUnicode, char2int, isStr, isBytes
+from reportlab.lib.utils import bytestr, isUnicode, char2int, isStr, isBytes
 from reportlab.pdfbase import pdfmetrics, pdfdoc
 from reportlab import rl_config
 from reportlab.lib.rl_accel import hex32, add32, calcChecksum, instanceStringWidthTTF
 from collections import namedtuple
+from io import BytesIO
 import os, time
 
 class TTFError(pdfdoc.PDFError):
@@ -349,7 +350,7 @@ class TTFontMaker:
 
     def makeStream(self):
         "Finishes the generation and returns the TTF file as a string"
-        stm = getBytesIO()
+        stm = BytesIO()
         write = stm.write
 
         tables = self.tables
diff --git a/src/reportlab/pdfgen/pdfimages.py b/src/reportlab/pdfgen/pdfimages.py
index 07c7e5e1..fe0753ee 100644
--- a/src/reportlab/pdfgen/pdfimages.py
+++ b/src/reportlab/pdfgen/pdfimages.py
@@ -11,7 +11,7 @@ import reportlab
 from reportlab import rl_config
 from reportlab.pdfbase import pdfutils
 from reportlab.pdfbase import pdfdoc
-from reportlab.lib.utils import import_zlib, haveImages, getBytesIO, isStr
+from reportlab.lib.utils import import_zlib, haveImages, isStr
 from reportlab.lib.rl_accel import fp_str, asciiBase85Encode
 from reportlab.lib.boxstuff import aspectRatioFix
 
diff --git a/tests/test_lib_utils.py b/tests/test_lib_utils.py
index ea251d60..fe3e4370 100644
--- a/tests/test_lib_utils.py
+++ b/tests/test_lib_utils.py
@@ -126,8 +126,9 @@ class ImporterTestCase(unittest.TestCase):
 
     def test10(self):
         "test open and read of a simple relative file"
-        from reportlab.lib.utils import open_and_read, getBytesIO
-        b = getBytesIO(_rel_open_and_read('../docs/images/Edit_Prefs.gif'))
+        from io import BytesIO
+        from reportlab.lib.utils import open_and_read
+        b = BytesIO(_rel_open_and_read('../docs/images/Edit_Prefs.gif'))
         b = open_and_read(b)
 
     def test11(self):
diff --git a/tests/test_pdfbase_ttfonts.py b/tests/test_pdfbase_ttfonts.py
index b2919bcf..370cf396 100644
--- a/tests/test_pdfbase_ttfonts.py
+++ b/tests/test_pdfbase_ttfonts.py
@@ -8,6 +8,7 @@ from reportlab.lib.testutils import setOutDir,makeSuiteForClasses, outputfile, p
 if __name__=='__main__':
     setOutDir(__name__)
 import unittest
+from io import BytesIO
 from reportlab.pdfgen.canvas import Canvas
 from reportlab.pdfbase import pdfmetrics
 from reportlab.pdfbase.pdfdoc import PDFDocument, PDFError
@@ -17,7 +18,7 @@ from reportlab.pdfbase.ttfonts import TTFont, TTFontFace, TTFontFile, TTFOpenFil
                                       FF_SYMBOLIC, FF_NONSYMBOLIC, \
                                       calcChecksum, add32
 from reportlab import rl_config
-from reportlab.lib.utils import getBytesIO, int2Byte
+from reportlab.lib.utils import int2Byte
 
 def utf8(code):
     "Convert a given UCS character index into UTF-8"
@@ -127,10 +128,10 @@ class TTFontFileTestCase(NearTestCase):
     def testFontFileFailures(self):
         "Tests TTFontFile constructor error checks"
         self.assertRaises(TTFError, TTFontFile, "nonexistent file")
-        self.assertRaises(TTFError, TTFontFile, getBytesIO(b""))
-        self.assertRaises(TTFError, TTFontFile, getBytesIO(b"invalid signature"))
-        self.assertRaises(TTFError, TTFontFile, getBytesIO(b"OTTO - OpenType not supported yet"))
-        self.assertRaises(TTFError, TTFontFile, getBytesIO(b"\0\1\0\0"))
+        self.assertRaises(TTFError, TTFontFile, BytesIO(b""))
+        self.assertRaises(TTFError, TTFontFile, BytesIO(b"invalid signature"))
+        self.assertRaises(TTFError, TTFontFile, BytesIO(b"OTTO - OpenType not supported yet"))
+        self.assertRaises(TTFError, TTFontFile, BytesIO(b"\0\1\0\0"))
 
     def testFontFileReads(self):
         "Tests TTFontParset.read_xxx"
@@ -189,17 +190,17 @@ class TTFontFileTestCase(NearTestCase):
     def testFontFileChecksum(self):
         "Tests TTFontFile and TTF parsing code"
         F = TTFOpenFile("Vera.ttf")[1].read()
-        TTFontFile(getBytesIO(F), validate=1) # should not fail
+        TTFontFile(BytesIO(F), validate=1) # should not fail
         F1 = F[:12345] + b"\xFF" + F[12346:] # change one byte
-        self.assertRaises(TTFError, TTFontFile, getBytesIO(F1), validate=1)
+        self.assertRaises(TTFError, TTFontFile, BytesIO(F1), validate=1)
         F1 = F[:8] + b"\xFF" + F[9:] # change one byte
-        self.assertRaises(TTFError, TTFontFile, getBytesIO(F1), validate=1)
+        self.assertRaises(TTFError, TTFontFile, BytesIO(F1), validate=1)
 
     def testSubsetting(self):
         "Tests TTFontFile and TTF parsing code"
         ttf = TTFontFile("Vera.ttf")
         subset = ttf.makeSubset([0x41, 0x42])
-        subset = TTFontFile(getBytesIO(subset), 0)
+        subset = TTFontFile(BytesIO(subset), 0)
         for tag in ('cmap', 'head', 'hhea', 'hmtx', 'maxp', 'name', 'OS/2',
                     'post', 'cvt ', 'fpgm', 'glyf', 'loca', 'prep'):
             self.assertTrue(subset.get_table(tag))
@@ -225,7 +226,7 @@ class TTFontFileTestCase(NearTestCase):
         ttf.add("QUUX", b"123")
         ttf.add("head", b"12345678xxxx")
         stm = ttf.makeStream()
-        ttf = TTFontParser(getBytesIO(stm), 0)
+        ttf = TTFontParser(BytesIO(stm), 0)
         self.assertEqual(ttf.get_table("ABCD"), b"xyzzy")
         self.assertEqual(ttf.get_table("QUUX"), b"123")
 
@@ -270,7 +271,7 @@ class TTFontTestCase(NearTestCase):
         # Glyphless variation of vedaal's invisible font retrieved from
         # http://www.angelfire.com/pr/pgpf/if.html, which says:
         # 'Invisible font' is unrestricted freeware. Enjoy, Improve, Distribute freely
-        import io, zlib, base64
+        import zlib, base64
         font = """
         eJzdlk1sG0UUx/+zs3btNEmrUKpCPxikSqRS4jpfFURUagmkEQQoiRXgAl07Y3vL2mvt2ml8APXG
         hQPiUEGEVDhWVHyIC1REPSAhBOWA+BCgSoULUqsKcWhVBKjhzfPU+VCi3Flrdn7vzZv33ryZ3TUE
@@ -294,7 +295,7 @@ class TTFontTestCase(NearTestCase):
         CMGjwvxTsr74/f/F95m3TH9x8o0/TU//N+7/D/ScVcA=
         """.encode('latin1')
         uncompressed = zlib.decompress(base64.decodebytes(font))
-        ttf = io.BytesIO(uncompressed)
+        ttf = BytesIO(uncompressed)
         setattr(ttf ,"name", "(invisible.ttf)")
         font = TTFont('invisible', ttf)
         for coord in font.face.bbox:
diff --git a/tests/test_pdfgen_general.py b/tests/test_pdfgen_general.py
index ed2b3024..599cbd88 100644
--- a/tests/test_pdfgen_general.py
+++ b/tests/test_pdfgen_general.py
@@ -8,6 +8,7 @@ from reportlab.lib.testutils import setOutDir,makeSuiteForClasses, outputfile, p
 setOutDir(__name__)
 import os
 import unittest
+from io import BytesIO
 from reportlab.pdfgen import canvas   # gmcm 2000/10/13, pdfgen now a package
 from reportlab.lib.units import inch, cm
 from reportlab.lib import colors
@@ -1256,7 +1257,6 @@ class PdfgenTestCase(unittest.TestCase):
             c.save()
 
     def testBytesIOSaves(self):
-        from io import BytesIO
         with BytesIO() as f:
             c = canvas.Canvas(f)
             c.drawString(100, 700, 'Hello World I write to %s' % repr(f))
@@ -1271,8 +1271,7 @@ class PdfgenTestCase(unittest.TestCase):
         self.assertRaises(TypeError,c.save)
 
 def trySomeColors(C,enforceColorSpace=None):
-    from reportlab.lib.utils import getBytesIO
-    out=getBytesIO()
+    out = BytesIO()
     canv = canvas.Canvas(out,enforceColorSpace=enforceColorSpace)
     canv.setFont('Helvetica',10)
     x = 0
diff --git a/tools/docco/graphdocpy.py b/tools/docco/graphdocpy.py
index 1d58bf8d..f4449087 100644
--- a/tools/docco/graphdocpy.py
+++ b/tools/docco/graphdocpy.py
@@ -11,6 +11,7 @@ __version__ = '0.8'
 import sys
 sys.path.insert(0, '.')
 import os, re, types, getopt, pickle, copy, time, pprint, traceback
+from io import StringIO
 from reportlab import rl_config
 
 from docpy import PackageSkeleton0, ModuleSkeleton0
@@ -24,7 +25,6 @@ from reportlab.lib.units import inch, cm
 from reportlab.lib.pagesizes import A4
 from reportlab.lib import colors
 from reportlab.lib.enums import TA_CENTER, TA_LEFT
-from reportlab.lib.utils import getStringIO
 from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
 from reportlab.pdfgen import canvas
 from reportlab.platypus.flowables import Flowable, Spacer
@@ -464,7 +464,7 @@ class GraphPdfDocBuilder0(PdfDocBuilder0):
         for key in keys:
             value = props[key]
 
-            f = getStringIO()
+            f = StringIO()
             pprint.pprint(value, f)
             value = f.getvalue()[:-1]
             valueLines = value.split('\n')
@@ -648,7 +648,7 @@ class GraphHtmlDocBuilder0(HtmlDocBuilder0):
             value = props[key]
 
             # Method 3
-            f = getStringIO()
+            f = StringIO()
             pprint.pprint(value, f)
             value = f.getvalue()[:-1]
             valueLines = value.split('\n')
diff --git a/tools/pythonpoint/pythonpoint.py b/tools/pythonpoint/pythonpoint.py
index 098247c1..746e8ec2 100644
--- a/tools/pythonpoint/pythonpoint.py
+++ b/tools/pythonpoint/pythonpoint.py
@@ -72,12 +72,13 @@ Recently added features are:
 """
 __version__='3.3.0'
 import os, sys, imp, pprint, getopt, glob, re
+from io import BytesIO
 
 from reportlab import rl_config
 from reportlab.lib import styles
 from reportlab.lib import colors
 from reportlab.lib.units import cm
-from reportlab.lib.utils import getBytesIO, isStr, isBytes, isUnicode
+from reportlab.lib.utils import isStr, isBytes, isUnicode
 from reportlab.lib.enums import TA_LEFT, TA_RIGHT, TA_CENTER, TA_JUSTIFY
 from reportlab.pdfbase import pdfmetrics
 from reportlab.pdfgen import canvas
@@ -353,7 +354,7 @@ class PPPresentation:
         if self.verbose:
             print(filename)
         #canv = canvas.Canvas(filename, pagesize = pageSize)
-        outfile = getBytesIO()
+        outfile = BytesIO()
         if self.notes:
             #translate the page from landscape to portrait
             pageSize= pageSize[1], pageSize[0]
@@ -404,7 +405,7 @@ class PPPresentation:
         if self.sourceFilename :
             filename = os.path.splitext(self.sourceFilename)[0] + '.pdf'
 
-        outfile = getBytesIO()
+        outfile = BytesIO()
         doc = SimpleDocTemplate(outfile, pagesize=rl_config.defaultPageSize, showBoundary=0)
         doc.leftMargin = 1*cm
         doc.rightMargin = 1*cm
-- 
2.30.2