【问题标题】:Are partial functions "officially" picklable?部分功能是否“正式”可腌制?
【发布时间】:2019-10-13 07:13:48
【问题描述】:

我需要创建一堆可以腌制的partial 函数。对此进行实证测试,它似乎工作正常:

import pickle
import functools

pickle.dumps(functools.partial(int, base=2))
# b'\x80\x03cfunctools\npartial\nq\x00cbuiltins\nint\nq\x01\x85q\x02Rq\x03(h\x01)}q\x04X\x04\x00\x00\x00baseq\x05K\x02sNtq\x06b.'

但是,文档中没有明确说明这一点,并且functools.partial() 的给定“大致等效”功能不可选择。

我可以假设partial 对象在任何情况下都是可提取的(没有边缘情况,独立于 C/Python 实现)?

【问题讨论】:

  • 你看actual implementation了吗?
  • @jonrsharpe:该实现被下面的from _functools import partial 取代。
  • @user2357112 可能,是的,但关键仍然是大致等效的实现不是实际的实现。
  • 你读过泡菜文档吗?有一整节介绍了如何创建自己的 pickleable 类。
  • stackoverflow.com/questions/14550577/… 你读到这里的答案了吗?

标签: python pickle functools


【解决方案1】:

文档中模拟partial() 函数的代码sn-p 不可选择,因为它使用嵌套函数。但是,官方的functools.partial() 是使用class 实现的,可以选择:cpython/functools.py#L234

官方 Python 问题跟踪器包含多个对 partial 对象不可挑选的引用,这已被视为错误:

此外,还有单元测试可以检查 partial 对象的可挑选性:cpython/test_functools.py#L244

Python 3.6 的 changelog 包含对 functools.partial 对象的可挑选性的引用:

bpo-27137functools.partial 的纯 Python 后备实现现在与其加速的 C 对应物的行为相匹配,用于子类化、酸洗和文本表示目的。

出于这些原因,我认为可以有把握地假设partial 可挑选性不是实现细节,可以依赖。

【讨论】:

  • 正如我在问题的 cmets 中提到的,functools.py 中的东西不是实际的实现。这是一个替代实现,会立即被替换。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-03
  • 2014-12-04
  • 2021-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多