是否可以“正式”选择部分功能?

时间:2019-10-13 07:13:48

标签: python pickle functools

我需要创建一堆可以腌制的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实现)?

1 个答案:

答案 0 :(得分:1)

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

可选的class实现的

Python官方问题追踪器包含对partial对象的一些引用,这些对象不可被腌制,这被认为是一个错误:

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

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

  

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

基于这些原因,我认为可以放心地假设partial的可腌制性不是实现细节,而是可以依靠的。