我如何明确不支持酸洗?
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")
我写了一个 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")