【问题标题】:Can I mark variables as transient so they won't be pickled?我可以将变量标记为瞬态以便它们不会被腌制吗?
【发布时间】:2011-06-11 01:04:00
【问题描述】:

假设我有一堂课:

class Thing(object):
    cachedBar = None

    def __init__(self, foo):
        self.foo = foo

    def bar(self):
        if not self.cachedBar:
            self.cachedBar = doSomeIntenseCalculation()
        return self.cachedBar

为了得到一些激烈的计算,所以我将它缓存在内存中以加快速度。

但是,当我腌制其中一个类时,我不希望 cachedBar 被腌制。

我可以将 cachedBar 标记为 volatile/transient/not picklable?

【问题讨论】:

  • 你可以找到昂贵的函数并记住它们。
  • @Nick 这正是他正在做的事情,只是他想确保备忘录不会与对象一起被腌制。
  • 卢克,我想会有更容易记忆的子功能。

标签: python pickle


【解决方案1】:

根据Pickle documentation,您可以提供一个名为__getstate__() 的方法,该方法返回代表您想要腌制的状态的内容(如果未提供,pickle 使用thing.__dict__)。所以,你可以这样做:

class Thing:
      def __getstate__(self):
            state = dict(self.__dict__)
            del state['cachedBar']
            return state

这不一定是dict,但如果是别的,你还需要实现__setstate__(state)

【讨论】:

  • 人们可以使用自定义数据描述符来概括此功能,该描述符将在self._transient 下存储事物,然后__getstate__ 可以只写入一次以忽略_transient。但这可能是矫枉过正,除非代码库这样做很多
  • 啊,谢谢,伙计!我一直在谷歌上搜索要附加或表示实际变量以排除它们的东西,我没想到要寻找一种方法来包含它们:S
  • 太棒了!对于json.dump,这需要明确的json.dump(self.__getstate__(), f)
【解决方案2】:

实现 __getstate__ 以仅返回要腌制的对象的哪些部分

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 2015-01-20
    • 2020-02-22
    相关资源
    最近更新 更多