假设由于崩溃,我将pickle对象写入磁盘的尝试是不完整的.尝试unpickle对象总是会导致异常,或者是否可能将写出的片段解释为有效的pickle并且错误被忽视?
与提供的其他答案相反,我相信我们可以就泡菜的可恢复性提出强有力的论据.答案是:"是的,一个不完整的泡菜总会导致异常."
为什么我们能做到这一点?因为"pickle"格式实际上是一种基于堆栈的小语言.在基于堆栈的语言中,您编写的代码会在堆栈上逐项推送项目,然后调用对您已累积的数据执行某些操作的运算符.事实上,一个泡菜必须以命令"."结束,它说:"现在将物品放在堆栈的底部并将其作为这个泡菜的值返回." 如果您的泡菜提前被切断,它将不会以此命令结束,您将收到EOF错误.
如果你想尝试恢复一些数据,你可能不得不编写自己的解释器,或者调用pickle.py来解决堆栈时想要引发EOFError但没有找到".".要记住的主要事情是,像大多数基于堆栈的语言一样,大数据结构是"向后"构建的:首先你在堆栈上放了很多小字符串或数字,然后你调用一个操作,说"放那些一起进入一个列表"或"抓取堆栈上的项目对并制作一个字典".所以,如果一个泡菜被中断,你会发现堆栈满对象的作品是将要建成的,但你会想念这最后的代码,告诉你什么打算从内置件.
| 归档时间: |
|
| 查看次数: |
809 次 |
| 最近记录: |