我注意到,当我的对象包含对模块的显式引用时,pickling
会因此而失败。
但是,如果我将对该模块中的函数的引用添加到我的对象中,则可以成功地对其进行拾取和取消。
为什么Python可以腌制功能,而不是模块?
答案 0 :(得分:2)
因为他们没有代码支持它。 C级类型(甚至用Python编写的模块都是用C级类型实现的)需要pickle
支持才能显式编码。
如果允许module
被腌制,确定应该腌制的东西并不容易;在另一边导入相同的名称看起来很简单,但是如果你真的试图挑选模块本身,那么担心的是你也想要腌制模块状态。如果模块是C扩展模块,那么模块状态甚至可能不会暴露给Python本身,只在C层内部使用,这更令人困惑。
鉴于通常你需要来自模块的特定事物,而不是整个模块(通常不被引用为状态,只是在顶层导入),支持模块酸洗的好处是有限的,并且语义不清楚,他们没有费心去实施它。