--- pyrepl/cmdrepl.py.orig	2015-12-06 11:35:46 UTC
+++ pyrepl/cmdrepl.py
@@ -33,7 +33,7 @@ It was designed to let you do this:
 which is in fact done by the `pythoni' script that comes with
 pyrepl."""
 
-from __future__ import print_function
+
 
 from pyrepl import completer
 from pyrepl.completing_reader import CompletingReader as CR
--- pyrepl/completer.py.orig	2015-12-06 11:35:46 UTC
+++ pyrepl/completer.py
@@ -18,7 +18,7 @@
 # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 try:
-    import __builtin__ as builtins
+    import builtins as builtins
     builtins  # silence broken pyflakes
 except ImportError:
     import builtins
@@ -44,8 +44,8 @@ class Completer(object):
         import keyword
         matches = []
         for list in [keyword.kwlist,
-                     builtins.__dict__.keys(),
-                     self.ns.keys()]:
+                     list(builtins.__dict__.keys()),
+                     list(self.ns.keys())]:
             for word in list:
                 if word.startswith(text) and word != "__builtins__":
                     matches.append(word)
--- pyrepl/completing_reader.py.orig	2015-12-06 11:35:46 UTC
+++ pyrepl/completing_reader.py
@@ -64,7 +64,7 @@ def build_menu(cons, wordlist, start, use_brackets, so
     else:
         item = "%s  "
         padding = 2
-    maxlen = min(max(map(real_len, wordlist)), cons.width - padding)
+    maxlen = min(max(list(map(real_len, wordlist))), cons.width - padding)
     cols = cons.width / (maxlen + padding)
     rows = (len(wordlist) - 1)/cols + 1
 
--- pyrepl/historical_reader.py.orig	2015-12-06 11:35:46 UTC
+++ pyrepl/historical_reader.py
@@ -23,7 +23,7 @@ from pyrepl.reader import Reader as R
 isearch_keymap = tuple(
     [('\\%03o'%c, 'isearch-end') for c in range(256) if chr(c) != '\\'] + \
     [(c, 'isearch-add-character')
-     for c in map(chr, range(32, 127)) if c != '\\'] + \
+     for c in map(chr, list(range(32, 127))) if c != '\\'] + \
     [('\\%03o'%c, 'isearch-add-character')
      for c in range(256) if chr(c).isalpha() and chr(c) != '\\'] + \
     [('\\\\', 'self-insert'),
@@ -292,7 +292,7 @@ class HistoricalReader(R):
     def finish(self):
         super(HistoricalReader, self).finish()
         ret = self.get_unicode()
-        for i, t in self.transient_history.items():
+        for i, t in list(self.transient_history.items()):
             if i < len(self.history) and i != self.historyi:
                 self.history[i] = t
         if ret:
--- pyrepl/input.py.orig	2019-04-16 13:00:52 UTC
+++ pyrepl/input.py
@@ -32,11 +32,11 @@
 # executive, temporary decision: [tab] and [C-i] are distinct, but
 # [meta-key] is identified with [esc key].  We demand that any console
 # class does quite a lot towards emulating a unix terminal.
-from __future__ import print_function
+
 import unicodedata
 from collections import deque
 import pprint
-from trace import trace
+from .trace import trace
 
 
 class InputTranslator(object):
--- pyrepl/keymap.py.orig	2019-04-16 13:00:52 UTC
+++ pyrepl/keymap.py
@@ -174,17 +174,17 @@ def parse_keys(key):
 
 def compile_keymap(keymap, empty=b''):
     r = {}
-    for key, value in keymap.items():
+    for key, value in list(keymap.items()):
         if isinstance(key, bytes):
             first = key[:1]
         else:
             first = key[0]
         r.setdefault(first, {})[key[1:]] = value
-    for key, value in r.items():
+    for key, value in list(r.items()):
         if empty in value:
             if len(value) != 1:
                 raise KeySpecError(
-                      "key definitions for %s clash"%(value.values(),))
+                      "key definitions for %s clash"%(list(value.values()),))
             else:
                 r[key] = value[empty]
         else:
--- pyrepl/keymaps.py.orig	2015-12-06 11:35:46 UTC
+++ pyrepl/keymaps.py
@@ -62,9 +62,9 @@ reader_emacs_keymap = tuple(
      (r'\M-\n', 'self-insert'),
      (r'\<backslash>', 'self-insert')] + \
     [(c, 'self-insert')
-     for c in map(chr, range(32, 127)) if c <> '\\'] + \
+     for c in map(chr, list(range(32, 127))) if c != '\\'] + \
     [(c, 'self-insert')
-     for c in map(chr, range(128, 256)) if c.isalpha()] + \
+     for c in map(chr, list(range(128, 256))) if c.isalpha()] + \
     [(r'\<up>', 'up'),
      (r'\<down>', 'down'),
      (r'\<left>', 'left'),
@@ -101,9 +101,9 @@ python_emacs_keymap = comp_emacs_keymap + (
     
 reader_vi_insert_keymap = tuple(
     [(c, 'self-insert')
-     for c in map(chr, range(32, 127)) if c <> '\\'] + \
+     for c in map(chr, list(range(32, 127))) if c != '\\'] + \
     [(c, 'self-insert')
-     for c in map(chr, range(128, 256)) if c.isalpha()] + \
+     for c in map(chr, list(range(128, 256))) if c.isalpha()] + \
     [(r'\C-d', 'delete'),
      (r'\<backspace>', 'backspace'),
      ('')])
--- pyrepl/pygame_console.py.orig	2015-12-06 11:35:46 UTC
+++ pyrepl/pygame_console.py
@@ -72,7 +72,7 @@ class FakeStdin:
         # argh!
         raise NotImplementedError
     def readline(self, n=None):
-        from reader import Reader
+        from .reader import Reader
         try:
             # this isn't quite right: it will clobber any prompt that's
             # been printed.  Not sure how to get around this...
@@ -130,7 +130,8 @@ class PyGameConsole(Console):
         s.fill(c, [0, 600 - bmargin, 800, bmargin])
         s.fill(c, [800 - rmargin, 0, lmargin, 600])
 
-    def refresh(self, screen, (cx, cy)):
+    def refresh(self, screen, xxx_todo_changeme):
+        (cx, cy) = xxx_todo_changeme
         self.screen = screen
         self.pygame_screen.fill(colors.bg,
                                 [0, tmargin + self.cur_top + self.scroll,
@@ -211,12 +212,12 @@ class PyGameConsole(Console):
         meta = bool(pyg_event.mod & (KMOD_ALT|KMOD_META))
 
         try:
-            return self.k[(pyg_event.unicode, meta, ctrl)], pyg_event.unicode
+            return self.k[(pyg_event.str, meta, ctrl)], pyg_event.str
         except KeyError:
             try:
-                return self.k[(pyg_event.key, meta, ctrl)], pyg_event.unicode
+                return self.k[(pyg_event.key, meta, ctrl)], pyg_event.str
             except KeyError:
-                return "invalid-key", pyg_event.unicode
+                return "invalid-key", pyg_event.str
 
     def get_event(self, block=1):
         """Return an Event instance.  Returns None if |block| is false
@@ -239,7 +240,7 @@ class PyGameConsole(Console):
             self.cmd_buf += c.encode('ascii', 'replace')
             self.k = k
 
-            if not isinstance(k, types.DictType):
+            if not isinstance(k, dict):
                 e = Event(k, self.cmd_buf, [])
                 self.k = self.keymap
                 self.cmd_buf = ''
@@ -282,7 +283,7 @@ class PyGameConsole(Console):
 
     def forgetinput(self):
         """Forget all pending, but not yet processed input."""
-        while pygame.event.poll().type <> NOEVENT:
+        while pygame.event.poll().type != NOEVENT:
             pass
     
     def getpending(self):
@@ -299,7 +300,7 @@ class PyGameConsole(Console):
 
     def wait(self):
         """Wait for an event."""
-        raise Exception, "erp!"
+        raise Exception("erp!")
 
     def repaint(self):
         # perhaps we should consolidate grobs?
--- pyrepl/pygame_keymap.py.orig	2015-12-06 11:35:46 UTC
+++ pyrepl/pygame_keymap.py
@@ -85,27 +85,25 @@ def _parse_key1(key, s):
     while not ret and s < len(key):
         if key[s] == '\\':
             c = key[s+1].lower()
-            if _escapes.has_key(c):
+            if c in _escapes:
                 ret = _escapes[c]
                 s += 2
             elif c == "c":
                 if key[s + 2] != '-':
-                    raise KeySpecError, \
-                              "\\C must be followed by `-' (char %d of %s)"%(
-                        s + 2, repr(key))
+                    raise KeySpecError("\\C must be followed by `-' (char %d of %s)"%(
+                        s + 2, repr(key)))
                 if ctrl:
-                    raise KeySpecError, "doubled \\C- (char %d of %s)"%(
-                        s + 1, repr(key))
+                    raise KeySpecError("doubled \\C- (char %d of %s)"%(
+                        s + 1, repr(key)))
                 ctrl = 1
                 s += 3
             elif c == "m":
                 if key[s + 2] != '-':
-                    raise KeySpecError, \
-                              "\\M must be followed by `-' (char %d of %s)"%(
-                        s + 2, repr(key))
+                    raise KeySpecError("\\M must be followed by `-' (char %d of %s)"%(
+                        s + 2, repr(key)))
                 if meta:
-                    raise KeySpecError, "doubled \\M- (char %d of %s)"%(
-                        s + 1, repr(key))
+                    raise KeySpecError("doubled \\M- (char %d of %s)"%(
+                        s + 1, repr(key)))
                 meta = 1
                 s += 3
             elif c.isdigit():
@@ -119,28 +117,25 @@ def _parse_key1(key, s):
             elif c == '<':
                 t = key.find('>', s)
                 if t == -1:
-                    raise KeySpecError, \
-                              "unterminated \\< starting at char %d of %s"%(
-                        s + 1, repr(key))
+                    raise KeySpecError("unterminated \\< starting at char %d of %s"%(
+                        s + 1, repr(key)))
                 try:
                     ret = _keynames[key[s+2:t].lower()]
                     s = t + 1
                 except KeyError:
-                    raise KeySpecError, \
-                              "unrecognised keyname `%s' at char %d of %s"%(
-                        key[s+2:t], s + 2, repr(key))
+                    raise KeySpecError("unrecognised keyname `%s' at char %d of %s"%(
+                        key[s+2:t], s + 2, repr(key)))
                 if ret is None:
                     return None, s
             else:
-                raise KeySpecError, \
-                          "unknown backslash escape %s at char %d of %s"%(
-                    `c`, s + 2, repr(key))
+                raise KeySpecError("unknown backslash escape %s at char %d of %s"%(
+                    repr(c), s + 2, repr(key)))
         else:
             if ctrl:
                 ret = chr(ord(key[s]) & 0x1f)   # curses.ascii.ctrl()
-                ret = unicode(ret)
+                ret = str(ret)
             else:
-                ret = unicode(key[s])
+                ret = str(key[s])
             s += 1
     return (ret, meta, ctrl), s
 
@@ -156,13 +151,12 @@ def parse_keys(key):
 
 def _compile_keymap(keymap):
     r = {}
-    for key, value in keymap.items():
+    for key, value in list(keymap.items()):
         r.setdefault(key[0], {})[key[1:]] = value
-    for key, value in r.items():
-        if value.has_key(()):
-            if len(value) <> 1:
-                raise KeySpecError, \
-                          "key definitions for %s clash"%(value.values(),)
+    for key, value in list(r.items()):
+        if () in value:
+            if len(value) != 1:
+                raise KeySpecError("key definitions for %s clash"%(list(value.values()),))
             else:
                 r[key] = value[()]
         else:
@@ -173,7 +167,7 @@ def compile_keymap(keymap):
     r = {}
     for key, value in keymap:
         k = parse_keys(key)
-        if value is None and r.has_key(k):
+        if value is None and k in r:
             del r[k]
         if k is not None:
             r[k] = value
@@ -182,7 +176,7 @@ def compile_keymap(keymap):
 def keyname(key):
     longest_match = ''
     longest_match_name = ''
-    for name, keyseq in keyset.items():
+    for name, keyseq in list(keyset.items()):
         if keyseq and key.startswith(keyseq) and \
                len(keyseq) > len(longest_match):
             longest_match = keyseq
@@ -202,7 +196,7 @@ def unparse_key(keyseq):
         return ''
     name, s = keyname(keyseq)
     if name:
-        if name <> 'escape' or s == len(keyseq):
+        if name != 'escape' or s == len(keyseq):
             return '\\<' + name + '>' + unparse_key(keyseq[s:])
         else:
             return '\\M-' + unparse_key(keyseq[1:])
@@ -211,7 +205,7 @@ def unparse_key(keyseq):
         r = keyseq[1:]
         if c == '\\':
             p = '\\\\'
-        elif _unescapes.has_key(c):
+        elif c in _unescapes:
             p = _unescapes[c]
         elif ord(c) < ord(' '):
             p = '\\C-%s'%(chr(ord(c)+96),)
@@ -226,7 +220,7 @@ def _unparse_keyf(keyseq):
         return []
     name, s = keyname(keyseq)
     if name:
-        if name <> 'escape' or s == len(keyseq):
+        if name != 'escape' or s == len(keyseq):
             return [name] + _unparse_keyf(keyseq[s:])
         else:
             rest = _unparse_keyf(keyseq[1:])
@@ -236,7 +230,7 @@ def _unparse_keyf(keyseq):
         r = keyseq[1:]
         if c == '\\':
             p = '\\'
-        elif _unescapes.has_key(c):
+        elif c in _unescapes:
             p = _unescapes[c]
         elif ord(c) < ord(' '):
             p = 'C-%s'%(chr(ord(c)+96),)
--- pyrepl/python_reader.py.orig	2015-12-06 11:35:46 UTC
+++ pyrepl/python_reader.py
@@ -20,8 +20,8 @@
 # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 # one impressive collections of imports:
-from __future__ import print_function
-from __future__ import unicode_literals
+
+
 from pyrepl.completing_reader import CompletingReader
 from pyrepl.historical_reader import HistoricalReader
 from pyrepl import completing_reader, reader
@@ -31,9 +31,9 @@ import imp, sys, os, re, code, traceback
 import atexit, warnings
 
 try:
-    unicode
+    str
 except:
-    unicode = str
+    str = str
 
 try:
     imp.find_module("twisted")
@@ -179,7 +179,7 @@ class ReaderConsole(code.InteractiveInterpreter):
         else:
             return
         try:
-            execfile(initfile, self.locals, self.locals)
+            exec(compile(open(initfile, "rb").read(), initfile, 'exec'), self.locals, self.locals)
         except:
             etype, value, tb = sys.exc_info()
             traceback.print_exception(etype, value, tb.tb_next)
@@ -203,7 +203,7 @@ class ReaderConsole(code.InteractiveInterpreter):
                         # can't have warnings spewed onto terminal
                         sv = warnings.showwarning
                         warnings.showwarning = eat_it
-                        l = unicode(self.reader.readline(), 'utf-8')
+                        l = str(self.reader.readline(), 'utf-8')
                     finally:
                         warnings.showwarning = sv
                 except KeyboardInterrupt:
@@ -301,7 +301,7 @@ class ReaderConsole(code.InteractiveInterpreter):
                     self.prepare()
                     try:
                         while 1:
-                            if sys.modules.has_key("_tkinter"):
+                            if "_tkinter" in sys.modules:
                                 self.really_tkinteract()
                                 # really_tkinteract is not expected to
                                 # return except via an exception, but:
--- pyrepl/reader.py.orig	2019-04-16 13:00:52 UTC
+++ pyrepl/reader.py
@@ -19,32 +19,32 @@
 # CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
 # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-from __future__ import unicode_literals
+
 import unicodedata
 from pyrepl import commands
 from pyrepl import input
 try:
-    unicode
+    str
 except NameError:
-    unicode = str
-    unichr = chr
-    basestring = bytes, str
+    str = str
+    chr = chr
+    str = bytes, str
 
 
 def _make_unctrl_map():
     uc_map = {}
-    for c in map(unichr, range(256)):
+    for c in map(chr, list(range(256))):
         if unicodedata.category(c)[0] != 'C':
             uc_map[c] = c
     for i in range(32):
-        c = unichr(i)
-        uc_map[c] = '^' + unichr(ord('A') + i - 1)
+        c = chr(i)
+        uc_map[c] = '^' + chr(ord('A') + i - 1)
     uc_map[b'\t'] = '    '  # display TABs as 4 characters
-    uc_map[b'\177'] = unicode('^?')
+    uc_map[b'\177'] = str('^?')
     for i in range(256):
-        c = unichr(i)
+        c = chr(i)
         if c not in uc_map:
-            uc_map[c] = unicode('\\%03o') % i
+            uc_map[c] = str('\\%03o') % i
     return uc_map
 
 
@@ -87,17 +87,17 @@ del _make_unctrl_map
 
 [SYNTAX_WHITESPACE,
  SYNTAX_WORD,
- SYNTAX_SYMBOL] = range(3)
+ SYNTAX_SYMBOL] = list(range(3))
 
 
 def make_default_syntax_table():
     # XXX perhaps should use some unicodedata here?
     st = {}
-    for c in map(unichr, range(256)):
+    for c in map(chr, list(range(256))):
         st[c] = SYNTAX_SYMBOL
-    for c in [a for a in map(unichr, range(256)) if a.isalpha()]:
+    for c in [a for a in map(chr, list(range(256))) if a.isalpha()]:
         st[c] = SYNTAX_WORD
-    st[unicode('\n')] = st[unicode(' ')] = SYNTAX_WHITESPACE
+    st[str('\n')] = st[str(' ')] = SYNTAX_WHITESPACE
     return st
 
 default_keymap = tuple(
@@ -145,9 +145,9 @@ default_keymap = tuple(
      #(r'\M-\n', 'insert-nl'),
      ('\\\\', 'self-insert')] +
     [(c, 'self-insert')
-     for c in map(chr, range(32, 127)) if c != '\\'] +
+     for c in map(chr, list(range(32, 127))) if c != '\\'] +
     [(c, 'self-insert')
-     for c in map(chr, range(128, 256)) if c.isalpha()] +
+     for c in map(chr, list(range(128, 256))) if c.isalpha()] +
     [(r'\<up>', 'up'),
      (r'\<down>', 'down'),
      (r'\<left>', 'left'),
@@ -245,7 +245,7 @@ feeling more loquacious than I am now."""
         self.console = console
         self.commands = {}
         self.msg = ''
-        for v in vars(commands).values():
+        for v in list(vars(commands).values()):
             if (isinstance(v, type) and
                     issubclass(v, commands.Command) and
                     v.__name__[0].islower()):
@@ -273,7 +273,7 @@ feeling more loquacious than I am now."""
         screeninfo = []
         w = self.console.width - 1
         p = self.pos
-        for ln, line in zip(range(len(lines)), lines):
+        for ln, line in zip(list(range(len(lines))), lines):
             ll = len(line)
             if 0 <= p <= ll:
                 if self.msg and not self.msg_at_bottom:
@@ -523,7 +523,7 @@ feeling more loquacious than I am now."""
 
     def do_cmd(self, cmd):
         #print cmd
-        if isinstance(cmd[0], basestring):
+        if isinstance(cmd[0], str):
             #XXX: unify to text
             cmd = self.commands.get(cmd[0],
                                     commands.invalid_command)(self, *cmd)
@@ -619,11 +619,11 @@ feeling more loquacious than I am now."""
     def get_buffer(self, encoding=None):
         if encoding is None:
             encoding = self.console.encoding
-        return unicode('').join(self.buffer).encode(self.console.encoding)
+        return str('').join(self.buffer).encode(self.console.encoding)
 
     def get_unicode(self):
         """Return the current buffer as a unicode string."""
-        return unicode('').join(self.buffer)
+        return str('').join(self.buffer)
 
 
 def test():
--- pyrepl/readline.py.orig	2019-04-16 14:11:33 UTC
+++ pyrepl/readline.py
@@ -248,16 +248,16 @@ class _ReadlineWrapper(object):
         self.config.completer_delims = dict.fromkeys(string)
 
     def get_completer_delims(self):
-        chars = self.config.completer_delims.keys()
+        chars = list(self.config.completer_delims.keys())
         chars.sort()
         return ''.join(chars)
 
     def _histline(self, line):
         line = line.rstrip('\n')
         try:
-            return unicode(line, ENCODING)
+            return str(line, ENCODING)
         except UnicodeDecodeError:   # bah, silently fall back...
-            return unicode(line, 'utf-8', 'replace')
+            return str(line, 'utf-8', 'replace')
 
     def get_history_length(self):
         return self.saved_history_length
@@ -293,7 +293,7 @@ class _ReadlineWrapper(object):
         history = self.get_reader().get_trimmed_history(maxlength)
         f = open(os.path.expanduser(filename), 'w')
         for entry in history:
-            if isinstance(entry, unicode):
+            if isinstance(entry, str):
                 try:
                     entry = entry.encode(ENCODING)
                 except UnicodeEncodeError:   # bah, silently fall back...
@@ -340,7 +340,7 @@ class _ReadlineWrapper(object):
     def _get_idxs(self):
         start = cursor = self.get_reader().pos
         buf = self.get_line_buffer()
-        for i in xrange(cursor - 1, -1, -1):
+        for i in range(cursor - 1, -1, -1):
             if buf[i] in self.get_completer_delims():
                 break
             start = i
@@ -396,7 +396,7 @@ def _make_stub(_name, _ret):
     def stub(*args, **kwds):
         import warnings
         warnings.warn("readline.%s() not implemented" % _name, stacklevel=2)
-    stub.func_name = _name
+    stub.__name__ = _name
     globals()[_name] = stub
 
 for _name, _ret in [
@@ -438,14 +438,14 @@ def _setup():
                 del sys.__raw_input__
             except AttributeError:
                 pass
-            return raw_input(prompt)
+            return input(prompt)
         sys.__raw_input__ = _wrapper.raw_input
 
     else:
         # this is not really what readline.c does.  Better than nothing I guess
-        import __builtin__
-        _old_raw_input = __builtin__.raw_input
-        __builtin__.raw_input = _wrapper.raw_input
+        import builtins
+        _old_raw_input = builtins.raw_input
+        builtins.raw_input = _wrapper.raw_input
 
 _old_raw_input = None
 _setup()
--- pyrepl/unix_console.py.orig	2015-12-06 11:35:46 UTC
+++ pyrepl/unix_console.py
@@ -40,9 +40,9 @@ class InvalidTerminal(RuntimeError):
     pass
 
 try:
-    unicode
+    str
 except NameError:
-    unicode = str
+    str = str
 
 _error = (termios.error, curses.error, InvalidTerminal)
 
@@ -221,7 +221,7 @@ class UnixConsole(Console):
 
         self.__offset = offset
 
-        for y, oldline, newline, in zip(range(offset, offset + height),
+        for y, oldline, newline, in zip(list(range(offset, offset + height)),
                                         oldscr,
                                         newscr):
             if oldline != newline:
@@ -533,7 +533,7 @@ class UnixConsole(Console):
             amount = struct.unpack(
                 "i", ioctl(self.input_fd, FIONREAD, "\0\0\0\0"))[0]
             data = os.read(self.input_fd, amount)
-            raw = unicode(data, self.encoding, 'replace')
+            raw = str(data, self.encoding, 'replace')
             #XXX: something is wrong here
             e.data += raw
             e.raw += raw
@@ -549,7 +549,7 @@ class UnixConsole(Console):
 
             amount = 10000
             data = os.read(self.input_fd, amount)
-            raw = unicode(data, self.encoding, 'replace')
+            raw = str(data, self.encoding, 'replace')
             #XXX: something is wrong here
             e.data += raw
             e.raw += raw
--- pyrepl/unix_eventqueue.py.orig	2019-04-16 13:00:52 UTC
+++ pyrepl/unix_eventqueue.py
@@ -30,9 +30,9 @@ from .trace import trace
 from termios import tcgetattr, VERASE
 import os
 try:
-    unicode
+    str
 except NameError:
-    unicode = str
+    str = str
 
 
 _keynames = {
@@ -74,7 +74,7 @@ CTRL_ARROW_KEYCODE = {
 
 def general_keycodes():
     keycodes = {}
-    for key, tiname in _keynames.items():
+    for key, tiname in list(_keynames.items()):
         keycode = curses.tigetstr(tiname)
         trace('key {key} tiname {tiname} keycode {keycode!r}', **locals())
         if keycode:
@@ -87,7 +87,7 @@ def EventQueue(fd, encoding):
     keycodes = general_keycodes()
     if os.isatty(fd):
         backspace = tcgetattr(fd)[6][VERASE]
-        keycodes[backspace] = unicode('backspace')
+        keycodes[backspace] = str('backspace')
     k = keymap.compile_keymap(keycodes)
     trace('keymap {k!r}', k=k)
     return EncodedQueue(k, encoding)
@@ -133,7 +133,7 @@ class EncodedQueue(object):
                 self.insert(Event('key', k, self.flush_buf()))
                 self.k = self.ck
 
-        elif self.buf and self.buf[0] == 033: # 033 == escape
+        elif self.buf and self.buf[0] == 0o33: # 033 == escape
             # escape sequence not recognized by our keymap: propagate it
             # outside so that i can be recognized as an M-... key (see also
             # the docstring in keymap.py, in particular the line \\E.
--- testing/infrastructure.py.orig	2015-12-06 11:35:46 UTC
+++ testing/infrastructure.py
@@ -17,7 +17,7 @@
 # CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
 # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-from __future__ import print_function
+
 from pyrepl.reader import Reader
 from pyrepl.console import Console, Event
 
--- testing/test_readline.py.orig	2015-12-06 11:35:46 UTC
+++ testing/test_readline.py
@@ -5,7 +5,7 @@ import sys
 
 if sys.version_info < (3, ):
     bytes_type = str
-    unicode_type = unicode
+    unicode_type = str
 else:
     bytes_type = bytes
     unicode_type = str
--- testing/test_unix_reader.py.orig	2019-04-16 13:00:52 UTC
+++ testing/test_unix_reader.py
@@ -1,11 +1,11 @@
-from __future__ import unicode_literals
+
 from pyrepl.unix_eventqueue import EncodedQueue, Event
 
 
 def test_simple():
     q = EncodedQueue({}, 'utf-8')
 
-    a = u'\u1234'
+    a = '\u1234'
     b = a.encode('utf-8')
     for c in b:
         q.push(c)
