Estoy tratando de hacer que mi volcado de codificador JSON flote con solo 2 decimales de precisión. Así que ‘2.241’ se convierte en ‘2.24’
He leído en esta respuesta de Alex Martelli que puede sobrescribir el FLOAT_REPR predeterminado de json.encoder. He probado lo siguiente:
>>> import json >>> json.encoder.FLOAT_REPR = lambda o: format(o, '.2f')
Pero no obtengo los mismos resultados:
>>> json.dumps(2.241) '2.241'
E incluso puedo verificar que FLOAT_REPR ha cambiado:
>>> print json.encoder.FLOAT_REPR <function at 0xb....>
Y funciona como se espera:
>>> json.encoder.FLOAT_REPR(2.241) 2.24
¿Por qué el módulo JSON integrado no usa FLOAT_REPR cuando veo que se ha sobrescrito y la solución debería estar funcionando de acuerdo con Alex Martelli?
He probado esto en dos computadoras diferentes, ambas ejecutando Python 2.7.6 en Ubuntu 14.0.4.
El problema se produce debido a las aceleraciones de CPython realizadas por c_make_encoder
en json.encoder
.
Si lo establece en None
, el truco json.encoder.FLOAT_REPR
funciona como se explica en esta respuesta en la misma pregunta :
El truco del parche de mono no parece funcionar con el módulo simplejson original si están instaladas las aceleraciones de C:
Mi implementación se puede ver en el repository jsonplustypes .
Nota: esta solución no funciona en Python 3.6+