json.encoder.FLOAT_REPR 改变但没有效果

Joh*_*ørn 6 python precision limit

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

我在Alex Martelli 的这个答案中读到,您可以覆盖 json.encoder 的默认 FLOAT_REPR。我尝试了以下方法:

>>> import json
>>> json.encoder.FLOAT_REPR = lambda o: format(o, '.2f')
Run Code Online (Sandbox Code Playgroud)

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

>>> json.dumps(2.241)
'2.241'
Run Code Online (Sandbox Code Playgroud)

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

>>> print json.encoder.FLOAT_REPR
<function <lambda> at 0xb....>
Run Code Online (Sandbox Code Playgroud)

并按预期工作:

>>> json.encoder.FLOAT_REPR(2.241)
2.24
Run Code Online (Sandbox Code Playgroud)

为什么内置 JSON 模块不使用 FLOAT_REPR 当我看到它已被覆盖并且解决方案应该根据 Alex Martelli 工作?

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

Joh*_*ørn 3

c_make_encoder出现该问题的原因是in所完成的 CPython 加速json.encoder

如果您将其设置为None,则该json.encoder.FLOAT_REPR技巧将按照同一问题的答案中的说明进行操作:

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

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

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