mirror of
https://github.com/python/cpython.git
synced 2025-10-06 15:11:58 +00:00
Issue #26719: More efficient formatting of ints and floats in json.
This commit is contained in:
parent
fc43511867
commit
e0805cf10e
2 changed files with 14 additions and 62 deletions
|
@ -32,7 +32,6 @@ for i in range(0x20):
|
|||
#ESCAPE_DCT.setdefault(chr(i), '\\u%04x' % (i,))
|
||||
|
||||
INFINITY = float('inf')
|
||||
FLOAT_REPR = repr
|
||||
|
||||
def py_encode_basestring(s):
|
||||
"""Return a JSON representation of a Python string
|
||||
|
@ -221,7 +220,7 @@ class JSONEncoder(object):
|
|||
_encoder = encode_basestring
|
||||
|
||||
def floatstr(o, allow_nan=self.allow_nan,
|
||||
_repr=FLOAT_REPR, _inf=INFINITY, _neginf=-INFINITY):
|
||||
_repr=float.__repr__, _inf=INFINITY, _neginf=-INFINITY):
|
||||
# Check for specials. Note that this type of test is processor
|
||||
# and/or platform-specific, so do tests which don't depend on the
|
||||
# internals.
|
||||
|
@ -268,6 +267,7 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
|
|||
list=list,
|
||||
str=str,
|
||||
tuple=tuple,
|
||||
_intstr=int.__str__,
|
||||
):
|
||||
|
||||
if _indent is not None and not isinstance(_indent, str):
|
||||
|
@ -309,10 +309,10 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
|
|||
# Subclasses of int/float may override __str__, but we still
|
||||
# want to encode them as integers/floats in JSON. One example
|
||||
# within the standard library is IntEnum.
|
||||
yield buf + str(int(value))
|
||||
yield buf + _intstr(value)
|
||||
elif isinstance(value, float):
|
||||
# see comment above for int
|
||||
yield buf + _floatstr(float(value))
|
||||
yield buf + _floatstr(value)
|
||||
else:
|
||||
yield buf
|
||||
if isinstance(value, (list, tuple)):
|
||||
|
@ -359,7 +359,7 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
|
|||
# also allow them. Many encoders seem to do something like this.
|
||||
elif isinstance(key, float):
|
||||
# see comment for int/float in _make_iterencode
|
||||
key = _floatstr(float(key))
|
||||
key = _floatstr(key)
|
||||
elif key is True:
|
||||
key = 'true'
|
||||
elif key is False:
|
||||
|
@ -368,7 +368,7 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
|
|||
key = 'null'
|
||||
elif isinstance(key, int):
|
||||
# see comment for int/float in _make_iterencode
|
||||
key = str(int(key))
|
||||
key = _intstr(key)
|
||||
elif _skipkeys:
|
||||
continue
|
||||
else:
|
||||
|
@ -389,10 +389,10 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
|
|||
yield 'false'
|
||||
elif isinstance(value, int):
|
||||
# see comment for int/float in _make_iterencode
|
||||
yield str(int(value))
|
||||
yield _intstr(value)
|
||||
elif isinstance(value, float):
|
||||
# see comment for int/float in _make_iterencode
|
||||
yield _floatstr(float(value))
|
||||
yield _floatstr(value)
|
||||
else:
|
||||
if isinstance(value, (list, tuple)):
|
||||
chunks = _iterencode_list(value, _current_indent_level)
|
||||
|
@ -419,10 +419,10 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
|
|||
yield 'false'
|
||||
elif isinstance(o, int):
|
||||
# see comment for int/float in _make_iterencode
|
||||
yield str(int(o))
|
||||
yield _intstr(o)
|
||||
elif isinstance(o, float):
|
||||
# see comment for int/float in _make_iterencode
|
||||
yield _floatstr(float(o))
|
||||
yield _floatstr(o)
|
||||
elif isinstance(o, (list, tuple)):
|
||||
yield from _iterencode_list(o, _current_indent_level)
|
||||
elif isinstance(o, dict):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue