json.encoder.FLOAT_REPR已更改,但没有任何效果[重复]


问题内容

这个问题已经在这里有了答案

如何限制JSONEncoder产生的浮点数的数量? (3个答案)

去年关闭。

我试图使我的JSON编码器转储浮点数只有2个十进制精度。所以‘2.241’变成‘2.24’

我已经阅读了Alex
Martelli的答案
,您可以覆盖json.encoder的默认FLOAT_REPR。我尝试了以下方法:

>>> import json
>>> json.encoder.FLOAT_REPR = lambda o: format(o, '.2f')

但是我没有得到相同的结果:

>>> json.dumps(2.241)
'2.241'

我什至可以验证FLOAT_REPR是否已更改:

>>> print json.encoder.FLOAT_REPR
<function <lambda> at 0xb....>

并按预期工作:

>>> json.encoder.FLOAT_REPR(2.241)
2.24

当我看到内置JSON模块已经被覆盖并且解决方案应该可以正常运行时,为什么内置JSON模块不使用FLOAT_REPR?

我已经在两台不同的计算机上对此进行了测试,它们都在Ubuntu 14.0.4上运行Python 2.7.6。


问题答案:

发生此问题的原因是c_make_encoderin所完成的CPython加速json.encoder

如果您将其设置为,None则该json.encoder.FLOAT_REPR技巧将按照以下答案在相同问题上的说明起作用:

如果安装了C加速,则Monkey-patch技巧似乎不适用于原始的simplejson模块:

我的实现可以在jsonplustypes存储库中看到。

注意:此解决方案不适用于python 3.6+