在Python中优雅地降级酸洗

Ram*_*hum 6 python graceful-degradation pickle

(你可以在某些背景下阅读这个问题)

我希望有一种优雅降级的方法来在Python中挑选对象.

当腌制一个对象时,让我们把它称为主对象,有时候Pickler引发一个异常,因为它不能腌制主对象的某个子对象.例如,我经常遇到的错误是"无法腌制模块对象".那是因为我从主对象引用了一个模块.

我知道我可以写一些东西用一个包含模块属性的外观替换该模块,但这会有自己的问题(1).

所以我想要的是一个酸洗功能,可以自动用包含其属性的外墙替换模块(以及任何其他难以腌制的对象).这可能不会产生完美的酸洗,但在许多情况下它就足够了.

有这样的事吗?有谁知道如何处理这个问题?


(1)一个问题是模块可能正在引用其中的其他模块.

Jas*_*mbs 0

下面的怎么样,它是一个包装器,您可以使用它来将一些模块(可能是任何模块)包装在可腌制的东西中。然后,您可以对 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)