2

我在我的代码中遇到过几次这个问题,并且无法在一个小案例中重现它,但我希望有人能指出我正确的方向。它在创建保存对象时发生(它基本上将我的程序的不同部分打包为一系列嵌套的字典,然后将它们腌制以写入文本文件)。这是代码的相关部分:

    so = {}
    for l in self.components.items():
        so[l[0]] = l[1].createSaveObject()
    temp = so
    print "Component SO:",temp
    print "Component Pickled:",jsonpickle.encode(temp)
    return jsonpickle.encode(temp)

因此,该函数循环遍历我的组件,为每个组件创建字典项,然后返回腌制结果。问题显示在两个打印语句中,它们给出以下输出(被截断以忽略正在被腌制而没有问题的工作组件):

Component SO: {..., 'points': {201: [(43, 614.6), (268, 614.6), (268, 254.6), (43, 254.6)], 2041: [(79.5, 607.15999999999997), (304.5, 607.15999999999997), (304.5, 247.16), (79.5, 247.16)]},...}
Component Pickled: {..., "points": {"201": [{"py/tuple": [43, 614.6]}, {"py/tuple": [268, 614.6]}, {"py/tuple": [268, 254.6]}, {"py/tuple": [43, 254.6]}], "2041": [{"py/tuple": [null, null]}, {"py/tuple": [null, null]}, {"py/tuple": [null, null]}, {"py/tuple": [null, null]}]},...}

如您所见,包含高精度数字(以及同一部分中被截断为常规值的其他元素)的字典条目被编码为 null。我无法从 python shell 中重现它——它只在程序运行时发生。但是,鉴于两个输出之间的唯一区别是 jsonpickle.encode 调用,我不确定如何查找源。

谢谢!

4

1 回答 1

2

使用 numpy.average 的输出时,我遇到了类似的问题。找到在我的用例中有效的代码:

http://nullege.com/codes/show/src@t@i@TinasoftPytextminer-HEAD@httpserver.py/472/jsonpickle.handlers.BaseHandler

import numpy as np

class NumpyFloatHandler(jsonpickle.handlers.BaseHandler):
    """
    Automatic conversion of numpy float  to python floats
    Required for jsonpickle to work correctly
    """
    def flatten(self, obj, data):
        """
        Converts and rounds a Numpy.float* to Python float
        """
        return round(obj,6)

jsonpickle.handlers.registry.register(np.float, NumpyFloatHandler)
jsonpickle.handlers.registry.register(np.float32, NumpyFloatHandler)
jsonpickle.handlers.registry.register(np.float64, NumpyFloatHandler)
于 2014-06-28T06:28:55.013 回答