217 lines
5.7 KiB
Python
217 lines
5.7 KiB
Python
import sys
|
|
|
|
try:
|
|
reversed = reversed
|
|
except NameError:
|
|
def reversed(sequence):
|
|
"""reversed(sequence) -> reverse iterator over values of the sequence
|
|
|
|
Return a reverse iterator
|
|
"""
|
|
if hasattr(sequence, '__reversed__'):
|
|
return sequence.__reversed__()
|
|
if not hasattr(sequence, '__getitem__'):
|
|
raise TypeError("argument to reversed() must be a sequence")
|
|
return reversed_iterator(sequence)
|
|
|
|
class reversed_iterator(object):
|
|
|
|
def __init__(self, seq):
|
|
self.seq = seq
|
|
self.remaining = len(seq)
|
|
|
|
def __iter__(self):
|
|
return self
|
|
|
|
def next(self):
|
|
i = self.remaining
|
|
if i > 0:
|
|
i -= 1
|
|
item = self.seq[i]
|
|
self.remaining = i
|
|
return item
|
|
raise StopIteration
|
|
|
|
def __length_hint__(self):
|
|
return self.remaining
|
|
|
|
try:
|
|
sorted = sorted
|
|
except NameError:
|
|
builtin_cmp = cmp # need to use cmp as keyword arg
|
|
|
|
def sorted(iterable, cmp=None, key=None, reverse=0):
|
|
use_cmp = None
|
|
if key is not None:
|
|
if cmp is None:
|
|
def use_cmp(x, y):
|
|
return builtin_cmp(x[0], y[0])
|
|
else:
|
|
def use_cmp(x, y):
|
|
return cmp(x[0], y[0])
|
|
l = [(key(element), element) for element in iterable]
|
|
else:
|
|
if cmp is not None:
|
|
use_cmp = cmp
|
|
l = list(iterable)
|
|
if use_cmp is not None:
|
|
l.sort(use_cmp)
|
|
else:
|
|
l.sort()
|
|
if reverse:
|
|
l.reverse()
|
|
if key is not None:
|
|
return [element for (_, element) in l]
|
|
return l
|
|
|
|
try:
|
|
set, frozenset = set, frozenset
|
|
except NameError:
|
|
from sets import set, frozenset
|
|
|
|
# pass through
|
|
enumerate = enumerate
|
|
|
|
try:
|
|
BaseException = BaseException
|
|
except NameError:
|
|
BaseException = Exception
|
|
|
|
try:
|
|
GeneratorExit = GeneratorExit
|
|
except NameError:
|
|
class GeneratorExit(Exception):
|
|
""" This exception is never raised, it is there to make it possible to
|
|
write code compatible with CPython 2.5 even in lower CPython
|
|
versions."""
|
|
pass
|
|
GeneratorExit.__module__ = 'exceptions'
|
|
|
|
if sys.version_info >= (3, 0):
|
|
exec ("print_ = print ; exec_=exec")
|
|
import builtins
|
|
|
|
# some backward compatibility helpers
|
|
_basestring = str
|
|
def _totext(obj, encoding=None):
|
|
if isinstance(obj, bytes):
|
|
obj = obj.decode(encoding)
|
|
elif not isinstance(obj, str):
|
|
obj = str(obj)
|
|
return obj
|
|
|
|
def _isbytes(x):
|
|
return isinstance(x, bytes)
|
|
def _istext(x):
|
|
return isinstance(x, str)
|
|
|
|
def _getimself(function):
|
|
return getattr(function, '__self__', None)
|
|
|
|
def _getfuncdict(function):
|
|
return getattr(function, "__dict__", None)
|
|
|
|
def _getcode(function):
|
|
return getattr(function, "__code__", None)
|
|
|
|
def execfile(fn, globs=None, locs=None):
|
|
if globs is None:
|
|
back = sys._getframe(1)
|
|
globs = back.f_globals
|
|
locs = back.f_locals
|
|
del back
|
|
elif locs is None:
|
|
locs = globs
|
|
fp = open(fn, "rb")
|
|
try:
|
|
source = fp.read()
|
|
finally:
|
|
fp.close()
|
|
co = compile(source, fn, "exec", dont_inherit=True)
|
|
exec_(co, globs, locs)
|
|
|
|
def callable(obj):
|
|
return hasattr(obj, "__call__")
|
|
|
|
else:
|
|
import __builtin__ as builtins
|
|
_totext = unicode
|
|
_basestring = basestring
|
|
execfile = execfile
|
|
callable = callable
|
|
def _isbytes(x):
|
|
return isinstance(x, str)
|
|
def _istext(x):
|
|
return isinstance(x, unicode)
|
|
|
|
def _getimself(function):
|
|
return getattr(function, 'im_self', None)
|
|
|
|
def _getfuncdict(function):
|
|
return getattr(function, "__dict__", None)
|
|
|
|
def _getcode(function):
|
|
try:
|
|
return getattr(function, "__code__")
|
|
except AttributeError:
|
|
return getattr(function, "func_code", None)
|
|
|
|
def print_(*args, **kwargs):
|
|
""" minimal backport of py3k print statement. """
|
|
sep = ' '
|
|
if 'sep' in kwargs:
|
|
sep = kwargs.pop('sep')
|
|
end = '\n'
|
|
if 'end' in kwargs:
|
|
end = kwargs.pop('end')
|
|
file = 'file' in kwargs and kwargs.pop('file') or sys.stdout
|
|
if kwargs:
|
|
args = ", ".join([str(x) for x in kwargs])
|
|
raise TypeError("invalid keyword arguments: %s" % args)
|
|
at_start = True
|
|
for x in args:
|
|
if not at_start:
|
|
file.write(sep)
|
|
file.write(str(x))
|
|
at_start = False
|
|
file.write(end)
|
|
|
|
def exec_(obj, globals=None, locals=None):
|
|
""" minimal backport of py3k exec statement. """
|
|
__tracebackhide__ = True
|
|
if globals is None:
|
|
frame = sys._getframe(1)
|
|
globals = frame.f_globals
|
|
if locals is None:
|
|
locals = frame.f_locals
|
|
elif locals is None:
|
|
locals = globals
|
|
exec2(obj, globals, locals)
|
|
|
|
if sys.version_info >= (3,0):
|
|
exec ("""
|
|
def _reraise(cls, val, tb):
|
|
__tracebackhide__ = True
|
|
assert hasattr(val, '__traceback__')
|
|
raise val
|
|
""")
|
|
else:
|
|
exec ("""
|
|
def _reraise(cls, val, tb):
|
|
__tracebackhide__ = True
|
|
raise cls, val, tb
|
|
def exec2(obj, globals, locals):
|
|
__tracebackhide__ = True
|
|
exec obj in globals, locals
|
|
""")
|
|
|
|
def _tryimport(*names):
|
|
""" return the first successfully imported module. """
|
|
assert names
|
|
for name in names:
|
|
try:
|
|
return __import__(name, None, None, '__doc__')
|
|
except ImportError:
|
|
excinfo = sys.exc_info()
|
|
_reraise(*excinfo)
|