97 lines
2.2 KiB
Python
97 lines
2.2 KiB
Python
"""Python 2/3 compat layer leftovers."""
|
|
|
|
import decimal as _decimal
|
|
import math as _math
|
|
import warnings
|
|
from contextlib import redirect_stderr, redirect_stdout
|
|
from io import BytesIO
|
|
from io import StringIO as UnicodeIO
|
|
from types import SimpleNamespace
|
|
|
|
from .textTools import Tag, bytechr, byteord, bytesjoin, strjoin, tobytes, tostr
|
|
|
|
warnings.warn(
|
|
"The py23 module has been deprecated and will be removed in a future release. "
|
|
"Please update your code.",
|
|
DeprecationWarning,
|
|
)
|
|
|
|
__all__ = [
|
|
"basestring",
|
|
"bytechr",
|
|
"byteord",
|
|
"BytesIO",
|
|
"bytesjoin",
|
|
"open",
|
|
"Py23Error",
|
|
"range",
|
|
"RecursionError",
|
|
"round",
|
|
"SimpleNamespace",
|
|
"StringIO",
|
|
"strjoin",
|
|
"Tag",
|
|
"tobytes",
|
|
"tostr",
|
|
"tounicode",
|
|
"unichr",
|
|
"unicode",
|
|
"UnicodeIO",
|
|
"xrange",
|
|
"zip",
|
|
]
|
|
|
|
|
|
class Py23Error(NotImplementedError):
|
|
pass
|
|
|
|
|
|
RecursionError = RecursionError
|
|
StringIO = UnicodeIO
|
|
|
|
basestring = str
|
|
isclose = _math.isclose
|
|
isfinite = _math.isfinite
|
|
open = open
|
|
range = range
|
|
round = round3 = round
|
|
unichr = chr
|
|
unicode = str
|
|
zip = zip
|
|
|
|
tounicode = tostr
|
|
|
|
|
|
def xrange(*args, **kwargs):
|
|
raise Py23Error("'xrange' is not defined. Use 'range' instead.")
|
|
|
|
|
|
def round2(number, ndigits=None):
|
|
"""
|
|
Implementation of Python 2 built-in round() function.
|
|
Rounds a number to a given precision in decimal digits (default
|
|
0 digits). The result is a floating point number. Values are rounded
|
|
to the closest multiple of 10 to the power minus ndigits; if two
|
|
multiples are equally close, rounding is done away from 0.
|
|
ndigits may be negative.
|
|
See Python 2 documentation:
|
|
https://docs.python.org/2/library/functions.html?highlight=round#round
|
|
"""
|
|
if ndigits is None:
|
|
ndigits = 0
|
|
|
|
if ndigits < 0:
|
|
exponent = 10 ** (-ndigits)
|
|
quotient, remainder = divmod(number, exponent)
|
|
if remainder >= exponent // 2 and number >= 0:
|
|
quotient += 1
|
|
return float(quotient * exponent)
|
|
else:
|
|
exponent = _decimal.Decimal("10") ** (-ndigits)
|
|
|
|
d = _decimal.Decimal.from_float(number).quantize(
|
|
exponent, rounding=_decimal.ROUND_HALF_UP
|
|
)
|
|
|
|
return float(d)
|