gpt4 book ai didi

python - 关于反序列化一些数字的问题(错误??)

转载 作者:行者123 更新时间:2023-12-03 10:08:19 24 4
gpt4 key购买 nike

为了反序列化 bytes 对象,我们使用 pickle.loads()

import pickle
import numpy as np
pickle.loads(np.float64(0.34103))
并且预期的结果如下所示(因为 np.float64(0.34103) 不是字节对象,预计会出现适当的错误)
---------------------------------------------------------------------------
UnpicklingError Traceback (most recent call last)
<ipython-input-19-5c07606a60f1> in <module>
----> 1 pickle.loads(np.float64(0.34103))

UnpicklingError: invalid load key, '\xc1'.
这里我们有一些问题,一些数字(很少见)像 0.34104 打印以下结果而没有错误。
pickle.loads(np.float64(0.34104))
True
仅当转换的字节以 b'\x88 开头时才会发生这种情况(例如 0.04263、0.08526、0.11651 ...)
np.float64(0.34104).tobytes()
b'\x88.\xa8o\x99\xd3\xd5?'
谁能回答这个问题是否是Python错误?
任何答案将不胜感激。

最佳答案

pickle.loads的输入并不完全限于 bytes目的。引用 docs ,

Return the reconstituted object hierarchy of the pickled representation data of an object. data must be a bytes-like object.


并引用“类似字节的对象” docs ,

An object that supports the Buffer Protocol and can export a C-contiguous buffer.


缓冲区协议(protocol)是对象将其底层内存缓冲区暴露给其他代码的一种方式,对于有意义的对象。 NumPy 数组支持缓冲区协议(protocol),允许其他代码对数组的底层存储进行操作,而不是通过昂贵的 Python 级索引操作和包装对象。 NumPy 标量也支持缓冲区协议(protocol),以尽可能无缝地处理 0 维数据。
pickle.loads(np.float64(0.34103)) 的错误不是因为 np.float64(0.34103)不是字节。如果你试图传入一个普通的 float ,你会得到一个 TypeError 因为类型是无效的( float 不是字节状的),但是有 np.float64(0.34103) , 你得到的错误是因为 pickle.loads尝试读取 np.float64(0.34103) 的缓冲区并发现其中的数据不是有效的 pickle 。
np.float64(0.34104) ,缓冲区的内容恰好是一个有效的 pickle 。侥幸的是,这些字节恰好匹配一个 NEWTRUE 操作码、一个 STOP 操作码和被忽略的尾随垃圾。 NEWTRUE 在 pickle 上推送 True堆栈,STOP 停止 pickle 执行,并返回 True。

关于python - 关于反序列化一些数字的问题(错误??),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64549386/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com