【问题标题】:Pickling a string reference腌制字符串引用
【发布时间】:2015-02-18 21:54:59
【问题描述】:

我必须腌制一个非常大的结构。在这个结构中,我必须更新一个在结构中被多次引用的字符串。

让我们让它变得更简单:

myStruct = [1, 'myStr', 2, 'myStr']

程序应同时使用新值更新“myStr”。 为了实现这一点,我做了一个这样的字符串引用类:

class StrReference(object):
   def __init__(self):
      self.value = 'myStr'

myRefStr = StrReference()     
myStruct = [1, myRefStr, 2, myRefStr]

现在我可以更新myRefStr.value = 'newStr'

我需要腌制myStruct 对象,以便StrReference 类被腌制为字符串。

[1, 'myStr', 2, 'myStr']
[1, 'newStr', 2, 'newStr']

我确实尝试过 __getstate____reduce__ 但没有运气。 腌制结果将始终引用StrReference 类。

有什么建议吗?

【问题讨论】:

  • 其实重点是:我需要将 StrReference 类腌制为一个简单的字符串。
  • ...或者我需要任何其他方式在我的大结构中一次更新这些字符串

标签: python-2.7 pickle


【解决方案1】:

使用__getstate____setstate__

getstate(自我)

除了存储对象的 dict 属性外,您还可以在对象被存储时返回要存储的自定义状态 腌制。 setstate 将在对象处于 未腌制。

setstate(自我,状态)

当对象被 unpickle 时,如果定义了 setstate,对象的状态将被传递给它,而不是直接应用于对象的 dict。这手到擒来 与 getstate 一起使用:当两者都定义时,您可以表示 对象的腌制状态随心所欲。

http://www.rafekettler.com/magicmethods.html#picklinghttps://docs.python.org/2/library/pickle.html#pickling-and-unpickling-normal-class-instances

【讨论】:

  • 我已经这样做了,但腌制的对象将保持 StrReference 而不是字符串。我需要它,一旦解开,结构就会包含字符串。
  • def __getstate__(self): return self.value
  • def __reduce__(self): retrun (string.__class, (self.value,))
  • 我没有实现 setstate,因为将 unpickle 的进程不知道 StrReference。它需要解开一个简单的字符串对象。这才是重点! :-/
猜你喜欢
  • 1970-01-01
  • 2010-10-16
  • 2015-04-21
  • 2015-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多