Spaces:
Running
Running
"""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) | |