部分函数 "officially" 是可腌制的吗?

Are partial functions "officially" picklable?

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

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() 的给定 "roughly equivalent" 函数不可 picklable。

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

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

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

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

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

bpo-27137: the pure Python fallback implementation of functools.partial now matches the behaviour of its accelerated C counterpart for subclassing, pickling and text representation purposes.

由于这些原因,我认为可以安全地假设 partial 可拾取性不是一个实现细节并且可以依赖。