我如何明确不支持酸洗?

How do I explicitly not support pickling?

我写了一个 Python class 不可能支持酸洗。不过,用户时不时会尝试 pickle 这个 class 的实例,这会导致令人困惑的错误。因此,每当尝试对我的 class 实例进行 pickle 时,我都希望抛出一条自定义的、信息丰富的错误消息。

我该怎么做才能最好地做到这一点? 我对覆盖面广的解决方案特别感兴趣,即不仅适用于标准库 pickle,而且适用于它的替代方案。

至于我目前发现的,我会写,但我不确定这是否是最好的方法。

通过阅读文档,我了解到如果 class 有一个 __getstate__ 方法,它会在尝试 pickling 时被调用。因此,一个解决方案是覆盖此方法以引发异常,例如:

import pickle

class Foo(object):
    def __getstate__(self):
        raise pickle.PickleError("No pickling for Foo.")

这似乎有效:

some_foo = Foo()
try:
    pickle.dumps(some_foo)
except pickle.PickleError:
    print("Error raised.")
else:
    raise AssertionError("Error not raised")