将额外的字段添加到现有的namedtuple对象并取消pickle

Moh*_*hit 5 python pickle namedtuple python-2.7

我有一些腌制格式的数据,其中包含以下对象的实例:

Point = namedtuple('Point', ['x',])
Run Code Online (Sandbox Code Playgroud)

现在我想扩展 Point 对象以添加另一个变量“y”,但也要保持它与我已经腌制的数据兼容。

以下是我尝试过的,但似乎失败了。我还尝试通过在创建 Point 对象时将 y 参数设置为可选来使用代码来创建 Point 类,但这效果不佳。关于如何进行的任何想法?

from collections import namedtuple
Point = namedtuple('Point', ['x'])
i = Point(1)
import cPickle
pick=cPickle.dumps(i)
Point = namedtuple('Point', ['x', 'y'])
cPickle.loads(pick)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 22, in __repr__
TypeError: not enough arguments for format string
Run Code Online (Sandbox Code Playgroud)

Mik*_*ler 2

元组是不可变的。x首先取消pickle,然后使用不同的namedtuple类创建一个新点并使用旧点的属性。对类使用相同的名称Point应该会产生您想要的效果:

Point = namedtuple('Point', ['x'])
i = Point(1)
pick=cPickle.dumps(i)


def unpickle_point(dumped_obj):
    Point = namedtuple('Point', ['x'])
    point = cPickle.loads(pick)
    Point = namedtuple('Point', ['x', 'y'])
    return Point(point.x, 2)

new_point = unpickle_point(pick)
Run Code Online (Sandbox Code Playgroud)

现在:

>>> new_point
Point(x=1, y=2)
Run Code Online (Sandbox Code Playgroud)