我需要创建一堆可以腌制的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实现)?
答案 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-27137:
functools.partial
的纯Python后备实现现在与用于子类,酸洗和文本表示目的的加速C语言对应行为相匹配。
基于这些原因,我认为可以放心地假设partial
的可腌制性不是实现细节,而是可以依靠的。