Add Py3 compatibility support helpers
This commit is contained in:
parent
a9a5f69c1a
commit
7aaf42a7b1
|
@ -0,0 +1,130 @@
|
||||||
|
import sys
|
||||||
|
|
||||||
|
__all__ = ['PY3', 'string_types', 'integer_types', 'text_type', 'bytes_type', 'long', 'input', 'bytestring', 'byte_ord', 'byte_chr', 'byte_mask', 'b', 'u', 'StringIO', 'BytesIO', 'is_callable', 'MAXSIZE', 'next']
|
||||||
|
|
||||||
|
PY3 = sys.version_info[0] >= 3
|
||||||
|
|
||||||
|
if PY3:
|
||||||
|
import collections
|
||||||
|
import struct
|
||||||
|
string_types = str
|
||||||
|
integer_types = int
|
||||||
|
text_type = str
|
||||||
|
bytes_type = bytes
|
||||||
|
long = int
|
||||||
|
input = input
|
||||||
|
|
||||||
|
def bytestring(s):
|
||||||
|
return s
|
||||||
|
|
||||||
|
def byte_ord(c):
|
||||||
|
assert isinstance(c, int)
|
||||||
|
return c
|
||||||
|
|
||||||
|
def byte_chr(c):
|
||||||
|
assert isinstance(c, int)
|
||||||
|
return struct.pack('B', c)
|
||||||
|
|
||||||
|
def byte_mask(c, mask):
|
||||||
|
assert isinstance(c, int)
|
||||||
|
return struct.pack('B', c & mask)
|
||||||
|
|
||||||
|
def b(s, encoding='utf8'):
|
||||||
|
"""cast unicode or bytes to bytes"""
|
||||||
|
if isinstance(s, bytes):
|
||||||
|
return s
|
||||||
|
elif isinstance(s, str):
|
||||||
|
return s.encode(encoding)
|
||||||
|
else:
|
||||||
|
raise TypeError("Expected unicode or bytes, got %r" % s)
|
||||||
|
|
||||||
|
def u(s, encoding='utf8'):
|
||||||
|
"""cast bytes or unicode to unicode"""
|
||||||
|
if isinstance(s, bytes):
|
||||||
|
return s.decode(encoding)
|
||||||
|
elif isinstance(s, str):
|
||||||
|
return s
|
||||||
|
else:
|
||||||
|
raise TypeError("Expected unicode or bytes, got %r" % s)
|
||||||
|
|
||||||
|
import io
|
||||||
|
StringIO = io.StringIO # NOQA
|
||||||
|
BytesIO = io.BytesIO # NOQA
|
||||||
|
|
||||||
|
def is_callable(c):
|
||||||
|
return isinstance(c, collections.Callable)
|
||||||
|
|
||||||
|
def get_next(c):
|
||||||
|
return c.__next__
|
||||||
|
|
||||||
|
next = next
|
||||||
|
|
||||||
|
MAXSIZE = sys.maxsize # NOQA
|
||||||
|
else:
|
||||||
|
string_types = basestring
|
||||||
|
integer_types = (int, long)
|
||||||
|
text_type = unicode
|
||||||
|
bytes_type = str
|
||||||
|
long = long
|
||||||
|
input = raw_input
|
||||||
|
|
||||||
|
def bytestring(s): # NOQA
|
||||||
|
if isinstance(s, unicode):
|
||||||
|
return s.encode('utf-8')
|
||||||
|
return s
|
||||||
|
|
||||||
|
byte_ord = ord # NOQA
|
||||||
|
byte_chr = chr # NOQA
|
||||||
|
|
||||||
|
def byte_mask(c, mask):
|
||||||
|
return chr(ord(c) & mask)
|
||||||
|
|
||||||
|
def b(s, encoding='utf8'): # NOQA
|
||||||
|
"""cast unicode or bytes to bytes"""
|
||||||
|
if isinstance(s, str):
|
||||||
|
return s
|
||||||
|
elif isinstance(s, unicode):
|
||||||
|
return s.encode(encoding)
|
||||||
|
else:
|
||||||
|
raise TypeError("Expected unicode or bytes, got %r" % s)
|
||||||
|
|
||||||
|
def u(s, encoding='utf8'): # NOQA
|
||||||
|
"""cast bytes or unicode to unicode"""
|
||||||
|
if isinstance(s, str):
|
||||||
|
return s.decode(encoding)
|
||||||
|
elif isinstance(s, unicode):
|
||||||
|
return s
|
||||||
|
else:
|
||||||
|
raise TypeError("Expected unicode or bytes, got %r" % s)
|
||||||
|
|
||||||
|
try:
|
||||||
|
import cStringIO
|
||||||
|
StringIO = cStringIO.StringIO # NOQA
|
||||||
|
except ImportError:
|
||||||
|
import StringIO
|
||||||
|
StringIO = StringIO.StringIO # NOQA
|
||||||
|
|
||||||
|
BytesIO = StringIO
|
||||||
|
|
||||||
|
def is_callable(c): # NOQA
|
||||||
|
return callable(c)
|
||||||
|
|
||||||
|
def get_next(c): # NOQA
|
||||||
|
return c.next
|
||||||
|
|
||||||
|
def next(c):
|
||||||
|
return c.next()
|
||||||
|
|
||||||
|
# It's possible to have sizeof(long) != sizeof(Py_ssize_t).
|
||||||
|
class X(object):
|
||||||
|
def __len__(self):
|
||||||
|
return 1 << 31
|
||||||
|
try:
|
||||||
|
len(X())
|
||||||
|
except OverflowError:
|
||||||
|
# 32-bit
|
||||||
|
MAXSIZE = int((1 << 31) - 1) # NOQA
|
||||||
|
else:
|
||||||
|
# 64-bit
|
||||||
|
MAXSIZE = int((1 << 63) - 1) # NOQA
|
||||||
|
del X
|
Loading…
Reference in New Issue