【问题标题】:Why can functions be pickled, but not modules?为什么函数可以腌制,而不是模块?
【发布时间】:2016-08-09 01:34:21
【问题描述】:

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

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

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

【问题讨论】:

  • @Tommy 模块是对象
  • isinstance(math, object) => True
  • 正确,抱歉。我试图了解,腌制模块的期望结果是什么?编码?国家?
  • 代码? -- 按照这个逻辑,酸洗函数是更大的问题,因此我的问题的标题。状态? --其他对象像模块一样存储状态。
  • @MaxB: 其他对象也可以在其类上定义__reduce__(或相关的更高级别的酸洗方法),但模块类型不能这样做,因为可能会酸洗/unpickle 会因模块而异。

标签: python pickle python-2.x python-module


【解决方案1】:

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

如果允许module 被腌制,那么确定应该腌制什么并不容易;在另一端导入相同的名称似乎很简单,但如果您实际上是在尝试腌制模块本身,那么担心您也想腌制模块状态。如果模块是 C 扩展模块,那就更令人困惑了,其中模块状态甚至可能不会暴露给 Python 本身,只在 C 层内部使用。

考虑到通常你想要从一个模块中获得特定的东西,而不是整个模块(通常不作为状态引用,只是在顶层导入),支持模块酸洗的好处是有限的,语义也不清楚,他们没有费心去实现它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-03
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 2014-10-10
    • 2011-04-05
    相关资源
    最近更新 更多