Вы, кажется, пытаетесь округлить значения с плавающей точкой до 4 десятичных знаков при генерации JSON (на основе тестовых примеров).
JSONEncoder
В доставке с Python 2.7 нет метода _iterencode
, поэтомувот почему это не называют.Также быстрый взгляд на json/encoder.py
показывает, что этот класс написан таким образом, что затрудняет изменение поведения кодирования с плавающей точкой.Возможно, было бы лучше разделить проблемы и округлить числа перед тем, как выполнять сериализацию JSON.
EDIT : Алекс Мартелли также предлагает решение с обезьяньим патчем в связанном ответе. Проблема этого подхода заключается в том, что вы вводите глобальную модификацию поведения библиотеки json
, которая может непреднамеренно повлиять на какой-то другой фрагмент кода в вашем приложении, который был написан с предположением, что числа с плавающей точкой были закодированы без округления.
Попробуйте это:
from collections import Mapping, Sequence
from unittest import TestCase, main
from json import dumps
def round_floats(o):
if isinstance(o, float):
return round(o, 4)
elif isinstance(o, basestring):
return o
elif isinstance(o, Sequence):
return [round_floats(item) for item in o]
elif isinstance(o, Mapping):
return dict((key, round_floats(value)) for key, value in o.iteritems())
else:
return o
class TestFoo(TestCase):
def test_it(self):
for val, res in ((.00123456, '0.0012'),
(.00009, '0.0001'),
(0.99999, '1.0'),
({'hello': 1.00001, 'world': [True, 1.00009]},
'{"world": [true, 1.0001], "hello": 1.0}')):
untrusted = dumps(round_floats(val))
self.assertEqual(untrusted, res)
if __name__ == '__main__':
main()