remove more Python2 compatibility
diff --git a/lib/java/src/test/java/org/apache/thrift/test/EqualityTest.java b/lib/java/src/test/java/org/apache/thrift/test/EqualityTest.java
index fee495c..02a14d0 100644
--- a/lib/java/src/test/java/org/apache/thrift/test/EqualityTest.java
+++ b/lib/java/src/test/java/org/apache/thrift/test/EqualityTest.java
@@ -20,10 +20,7 @@
 /*
 This program was generated by the following Python script:
 
-#!/usr/bin/python2.5
-
-# Remove this when Python 2.6 hits the streets.
-from __future__ import with_statement
+#!/usr/bin/python3
 
 import sys
 import os.path
diff --git a/lib/py/setup.py b/lib/py/setup.py
index 066483e..2a170a4 100644
--- a/lib/py/setup.py
+++ b/lib/py/setup.py
@@ -97,8 +97,6 @@
         extensions = dict()
 
     ssl_deps = []
-    if sys.version_info[0] == 2:
-        ssl_deps.append('ipaddress')
     if sys.hexversion < 0x03050000:
         ssl_deps.append('backports.ssl_match_hostname>=3.5')
     tornado_deps = ['tornado>=4.0']
diff --git a/lib/py/src/TRecursive.py b/lib/py/src/TRecursive.py
index abf202c..aed696a 100644
--- a/lib/py/src/TRecursive.py
+++ b/lib/py/src/TRecursive.py
@@ -10,11 +10,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from __future__ import absolute_import
-from __future__ import division
-from __future__ import print_function
-from __future__ import unicode_literals
-
 from thrift.Thrift import TType
 
 TYPE_IDX = 1
diff --git a/lib/py/src/TTornado.py b/lib/py/src/TTornado.py
index 5eff11d..c409e09 100644
--- a/lib/py/src/TTornado.py
+++ b/lib/py/src/TTornado.py
@@ -17,7 +17,6 @@
 # under the License.
 #
 
-from __future__ import absolute_import
 import logging
 import socket
 import struct
@@ -34,7 +33,7 @@
 logger = logging.getLogger(__name__)
 
 
-class _Lock(object):
+class _Lock:
     def __init__(self):
         self._waiters = deque()
 
diff --git a/lib/py/src/compat.py b/lib/py/src/compat.py
index 0e8271d..3b3d57f 100644
--- a/lib/py/src/compat.py
+++ b/lib/py/src/compat.py
@@ -17,30 +17,13 @@
 # under the License.
 #
 
-import sys
+from io import BytesIO as BufferIO  # noqa
 
-if sys.version_info[0] == 2:
+def binary_to_str(bin_val):
+    return bin_val.decode('utf8')
 
-    from cStringIO import StringIO as BufferIO
+def str_to_binary(str_val):
+    return bytes(str_val, 'utf8')
 
-    def binary_to_str(bin_val):
-        return bin_val
-
-    def str_to_binary(str_val):
-        return str_val
-
-    def byte_index(bytes_val, i):
-        return ord(bytes_val[i])
-
-else:
-
-    from io import BytesIO as BufferIO  # noqa
-
-    def binary_to_str(bin_val):
-        return bin_val.decode('utf8')
-
-    def str_to_binary(str_val):
-        return bytes(str_val, 'utf8')
-
-    def byte_index(bytes_val, i):
-        return bytes_val[i]
+def byte_index(bytes_val, i):
+    return bytes_val[i]
diff --git a/lib/py/src/protocol/TJSONProtocol.py b/lib/py/src/protocol/TJSONProtocol.py
index 1741702..fef0cc9 100644
--- a/lib/py/src/protocol/TJSONProtocol.py
+++ b/lib/py/src/protocol/TJSONProtocol.py
@@ -263,19 +263,11 @@
 
     def _toChar(self, high, low=None):
         if not low:
-            if sys.version_info[0] == 2:
-                return ("\\u%04x" % high).decode('unicode-escape') \
-                                         .encode('utf-8')
-            else:
-                return chr(high)
+            return chr(high)
         else:
             codepoint = (1 << 16) + ((high & 0x3ff) << 10)
             codepoint += low & 0x3ff
-            if sys.version_info[0] == 2:
-                s = "\\U%08x" % codepoint
-                return s.decode('unicode-escape').encode('utf-8')
-            else:
-                return chr(codepoint)
+            return chr(codepoint)
 
     def readJSONString(self, skipContext):
         highSurrogate = None
@@ -317,7 +309,7 @@
             elif character in ESCAPE_CHAR_VALS:
                 raise TProtocolException(TProtocolException.INVALID_DATA,
                                          "Unescaped control char")
-            elif sys.version_info[0] > 2:
+            else:
                 utf8_bytes = bytearray([ord(character)])
                 while ord(self.reader.peek()) >= 0x80:
                     utf8_bytes.append(ord(self.reader.read()))
diff --git a/lib/py/src/protocol/TProtocol.py b/lib/py/src/protocol/TProtocol.py
index bac54ae..ec71ab3 100644
--- a/lib/py/src/protocol/TProtocol.py
+++ b/lib/py/src/protocol/TProtocol.py
@@ -261,11 +261,6 @@
                 raise TProtocolException(type=TProtocolException.INVALID_DATA,
                                          message='Invalid binary field type %d' % ttype)
             return ('readBinary', 'writeBinary', False)
-        if sys.version_info[0] == 2 and spec == 'UTF8':
-            if ttype != TType.STRING:
-                raise TProtocolException(type=TProtocolException.INVALID_DATA,
-                                         message='Invalid string field type %d' % ttype)
-            return ('readUtf8', 'writeUtf8', False)
         return self._TTYPE_HANDLERS[ttype] if ttype < len(self._TTYPE_HANDLERS) else (None, None, False)
 
     def _read_by_ttype(self, ttype, spec, espec):
diff --git a/lib/py/src/transport/TTransport.py b/lib/py/src/transport/TTransport.py
index ff20d7e..a686b12 100644
--- a/lib/py/src/transport/TTransport.py
+++ b/lib/py/src/transport/TTransport.py
@@ -17,9 +17,10 @@
 # under the License.
 #
 
+from io import BytesIO as BufferIO
+
 from struct import pack, unpack
 from thrift.Thrift import TException
-from ..compat import BufferIO
 
 
 class TTransportException(TException):
diff --git a/lib/py/src/transport/TZlibTransport.py b/lib/py/src/transport/TZlibTransport.py
index e848579..8b08297 100644
--- a/lib/py/src/transport/TZlibTransport.py
+++ b/lib/py/src/transport/TZlibTransport.py
@@ -22,13 +22,12 @@
 data compression.
 """
 
-from __future__ import division
 import zlib
 from .TTransport import TTransportBase, CReadableTransport
 from ..compat import BufferIO
 
 
-class TZlibTransportFactory(object):
+class TZlibTransportFactory:
     """Factory transport that builds zlib compressed transports.
 
     This factory caches the last single client/transport that it was passed
diff --git a/lib/py/test/thrift_json.py b/lib/py/test/thrift_json.py
index 125ea59..5a491e2 100644
--- a/lib/py/test/thrift_json.py
+++ b/lib/py/test/thrift_json.py
@@ -42,8 +42,6 @@
         transport = TTransport.TBufferedTransportFactory().getTransport(buf)
         protocol = TJSONProtocol(transport)
 
-        if sys.version_info[0] == 2:
-            unicode_text = unicode_text.encode('utf8')
         self.assertEqual(protocol.readString(), unicode_text)
 
     def test_TJSONProtocol_write(self):