Python “是部分函数”;正式地;可挑选的?
我需要创建一组可以进行pickle处理的函数。通过经验测试,它似乎工作得很好:Python “是部分函数”;正式地;可挑选的?,python,pickle,functools,Python,Pickle,Functools,我需要创建一组可以进行pickle处理的函数。通过经验测试,它似乎工作得很好: 导入pickle 导入功能工具 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' 但是,文档中没有明确说明这一点,并且的给定
导入pickle
导入功能工具
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'
但是,文档中没有明确说明这一点,并且的给定“大致等效”函数不可拾取
我是否可以假设
partial
对象在任何情况下都是可拾取的(没有边缘情况,与C/Python实现无关)?文档中模拟partial()
函数的代码片段不可拾取,因为它使用嵌套函数。但是,官方的functools.partial()
是使用可拾取的类实现的:
官方的Python问题跟踪器包含了对不可拾取的partial
对象的多个引用,这被认为是一个bug:
此外,还有一些单元测试用于检查部分对象的可拾取性:
Python3.6版包含对functools.partial
对象可拾取性的引用:
:functools.partial的纯Python回退实现现在与它的加速C对应的行为相匹配,用于子类化、pickle和文本表示
基于这些原因,我认为可以有把握地假设,partial
picklability不是一个实现细节,可以依赖。您是否查看了?@jornsharpe:该实现被下面的替换为
。@user2357112可能,是的,但问题仍然是,大致相当的实现并不是实际的实现。你读过pickle文档吗?有一整节是关于如何创建自己的可pickle类的。您阅读了这里的答案注释了吗?正如我在问题注释中提到的,functools.py
中的内容不是实际的实现。它是一种替代实现,可以立即替换。