为什么函数可以被 pickle 而模块不能?

Why can functions be pickled, but not modules?

我注意到当我的对象包含对模块的显式引用时,pickling它会因此失败。

但是,如果我将对该模块中的函数的引用粘贴到我的对象中,则它可以成功地被拾取和解封。

为什么 Python 可以 pickle 函数,但不能 pickle 模块?

因为他们没有代码支持它。 C 级类型(甚至用 Python 编写的模块都是用 C 级类型实现的)需要 pickle 支持才能显式编码。

如果 module 允许 pickle,则很难确定应该 pickle 什么;在另一侧导入相同的名称看起来很简单,但如果您实际上是在尝试 pickle 模块本身,那么担心的是您也想 pickle 模块状态。如果模块是 C 扩展模块,则更令人困惑,其中模块状态甚至可能不会暴露给 Python 本身,仅在 C 层内部使用。

考虑到您通常需要模块中的特定内容,而不是整个模块(通常不作为状态引用,只是在顶层导入),支持模块 pickling 的好处是有限的,并且语义不清楚,他们还懒得去实施。