python - 防止字段被 pickle

标签 python pickle

我有这样一个类:

class Something(object):

    def __init__(self):
        self._thing_id
        self._cached_thing

    @property
    def thing(self):
        if self._cached_thing:
            return self._cached_thing

        return Thing.objects.get(id=self._thing_id)

像这样对对象进行 pickling 时,我想防止对 _cached_thing 字段进行 pickling,因为它是易变的并且是专门在内存中实现的。

有没有办法向 Pickle 建议我只希望对我的字段的一个子集进行 pickle?

最佳答案

可以通过三种方式自定义 Pickle,如 the docs 中所述。 .

  • 提供__getstate____setstate__ 方法。
  • 提供 __getnewargs__/__getnewargs_ex__(以及采用这些参数的构造函数)。
  • 提供 __reduce__(以及提供给 __reduce__ 的函数来反转它)。

第一个通常是最简单的:

class Something(object):

    def __init__(self):
        self._thing_id
        self._cached_thing

    def __getstate__(self):
        return self._thing_id
    def __setstate__(self, thing_id):
        self._thing_id = thing_id

    # etc.

如果你想要更通用的东西,它会选择所有值(包括由子类设置的值,或在创建后动态设置的值等)除了你的黑名单,请注意默认值是“实例的__dict__ 是 pickle 的”,所以只需过滤一下:

_blacklist = ['_cached_thing']
def __getstate__(self):
    return {k: v for k, v in self.__dict__.items() if k not in self._blacklist}
def __setstate__(self, state):
    self.__dict__.update(state)

请参阅 gnibbler 的 comment关于这个问题:如果你正在做一些通用的事情,你应该认真考虑提出某种命名约定,而不是在每个类中放置一个黑名单。任何知道或学习该约定的读者都会立即知道哪些属性是“缓存”值而不是“真实”值的一部分,事情的工作原理会更加明显,每个类中你要做的工作更少,并且更少的地方因打字错误而搞砸了……

关于python - 防止字段被 pickle ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19991841/

相关文章:

python - 如何在 azure 广告中实现单点登录 django 身份验证?

python - 使用 Python 从非常复杂的 JSON 文件中提取数据

python - 使用增量分类器 sklearn 在 cPickle 之后文件大小增加和减少

python - 为什么不能 dill/pickle 类定义?

python - Pandas 与 pickle 0.14.1 和 0.15.2 的向后兼容性问题

python - 单击按钮并将当前时间和默认值保存在数据库中(Django)

Python的多处理和内存

python - 用户输入 "Heads"或 "Tails"的简单 Python 程序

python - Python 中 pickle 时出现 EOFError

python - 用 lambda pickle defaultdict