部分函数 "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
可拾取性不是一个实现细节并且可以依赖。
我需要创建一堆 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
可拾取性不是一个实现细节并且可以依赖。