json.encoder.FLOAT_REPR cambió pero no tiene efecto

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+