|
"""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) |
|
|