Ram*_*hum 6 python graceful-degradation pickle
(你可以在某些背景下阅读这个问题)
我希望有一种优雅降级的方法来在Python中挑选对象.
当腌制一个对象时,让我们把它称为主对象,有时候Pickler引发一个异常,因为它不能腌制主对象的某个子对象.例如,我经常遇到的错误是"无法腌制模块对象".那是因为我从主对象引用了一个模块.
我知道我可以写一些东西用一个包含模块属性的外观替换该模块,但这会有自己的问题(1).
所以我想要的是一个酸洗功能,可以自动用包含其属性的外墙替换模块(以及任何其他难以腌制的对象).这可能不会产生完美的酸洗,但在许多情况下它就足够了.
有这样的事吗?有谁知道如何处理这个问题?
(1)一个问题是模块可能正在引用其中的其他模块.
下面的怎么样,它是一个包装器,您可以使用它来将一些模块(可能是任何模块)包装在可腌制的东西中。然后,您可以对 Pickler 对象进行子类化,以检查目标对象是否是模块,如果是,则包装它。这能实现你的愿望吗?
class PickleableModuleWrapper(object):
def __init__(self, module):
# make a copy of the module's namespace in this instance
self.__dict__ = dict(module.__dict__)
# remove anything that's going to give us trouble during pickling
self.remove_unpickleable_attributes()
def remove_unpickleable_attributes(self):
for name, value in self.__dict__.items():
try:
pickle.dumps(value)
except Exception:
del self.__dict__[name]
import pickle
p = pickle.dumps(PickleableModuleWrapper(pickle))
wrapped_mod = pickle.loads(p)
Run Code Online (Sandbox Code Playgroud)