如果酸洗被中断,那么取消涂层肯定会失败吗? - Python

Cas*_*ash 4 python

假设由于崩溃,我将pickle对象写入磁盘的尝试是不完整的.尝试unpickle对象总是会导致异常,或者是否可能将写出的片段解释为有效的pickle并且错误被忽视?

Bra*_*des 7

与提供的其他答案相反,我相信我们可以就泡菜的可恢复性提出强有力的论据.答案是:"是的,一个不完整的泡菜总会导致异常."

为什么我们能做到这一点?因为"pickle"格式实际上是一种基于堆栈的小语言.在基于堆栈的语言中,您编写的代码会在堆栈上逐项推送项目,然后调用对您已累积的数据执行某些操作的运算符.事实上,一个泡菜必须以命令"."结束,它说:"现在将物品放在堆栈的底部并将其作为这个泡菜的值返回." 如果您的泡菜提前被切断,它将不会以此命令结束,您将收到EOF错误.

如果你想尝试恢复一些数据,你可能不得不编写自己的解释器,或者调用pickle.py来解决堆栈时想要引发EOFError但没有找到".".要记住的主要事情是,像大多数基于堆栈的语言一样,大数据结构是"向后"构建的:首先你在堆栈上放了很多小字符串或数字,然后你调用一个操作,说"放那些一起进入一个列表"或"抓取堆栈上的项目对并制作一个字典".所以,如果一个泡菜被中断,你会发现堆栈满对象的作品是将要建成的,但你会想念这最后的代码,告诉你什么打算从内置件.