diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2016-04-10 11:41:19 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2016-04-10 11:41:19 (GMT) |
commit | e0805cf10ea84b44a13ad5649267edba7cb83ee9 (patch) | |
tree | a40e8e3d1cd72b030628cd6d8bb5abe6632c22d6 /Lib/json | |
parent | fc43511867bfee131a3bfb18969ad02a1bb44a07 (diff) | |
download | cpython-e0805cf10ea84b44a13ad5649267edba7cb83ee9.zip cpython-e0805cf10ea84b44a13ad5649267edba7cb83ee9.tar.gz cpython-e0805cf10ea84b44a13ad5649267edba7cb83ee9.tar.bz2 |
Issue #26719: More efficient formatting of ints and floats in json.
Diffstat (limited to 'Lib/json')
-rw-r--r-- | Lib/json/encoder.py | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/Lib/json/encoder.py b/Lib/json/encoder.py index 26e9eb2..d596489 100644 --- a/Lib/json/encoder.py +++ b/Lib/json/encoder.py @@ -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): |