如何解决类型错误:不能腌制结构对象
我是 python 包 Construct 的维护者,我寻求帮助使这个库可以pickle。有人来找我,要求它可以泡在云朵上。不幸的是,我所拥有的课程既不能腌制,也不能用 cloudpickle 或 dill-able。请帮忙。
相关票证是:https://github.com/construct/construct/issues/894
$ python3
Python 3.6.9 (default,Oct 8 2020,12:12:24)
[GCC 8.4.0] on linux
Type "help","copyright","credits" or "license" for more information.
>>> import cloudpickle
>>> import construct
>>> cloudpickle.dumps(construct.Byte)
Traceback (most recent call last):
File "<stdin>",line 1,in <module>
File "/usr/local/lib/python3.6/dist-packages/cloudpickle/cloudpickle_fast.py",line 102,in dumps
cp.dump(obj)
File "/usr/local/lib/python3.6/dist-packages/cloudpickle/cloudpickle_fast.py",line 563,in dump
return Pickler.dump(self,obj)
File "/usr/lib/python3.6/pickle.py",line 409,in dump
self.save(obj)
File "/usr/lib/python3.6/pickle.py",line 521,in save
self.save_reduce(obj=obj,*rv)
File "/usr/lib/python3.6/pickle.py",line 634,in save_reduce
save(state)
File "/usr/lib/python3.6/pickle.py",line 476,in save
f(self,obj) # Call unbound method with explicit self
File "/usr/lib/python3.6/pickle.py",line 821,in save_dict
self._batch_setitems(obj.items())
File "/usr/lib/python3.6/pickle.py",line 847,in _batch_setitems
save(v)
File "/usr/lib/python3.6/pickle.py",line 496,in save
rv = reduce(self.proto)
TypeError: can't pickle Struct objects
解决方法
已解决:该错误给了我一条线索。我试图腌制的字节类对象是一个 FormatField,与 Struct 类无关。经过几个小时的思考,我才意识到 Struct 指的是 struct.Struct 而不是 constructor.Struct。去掉之后就可以正常序列化了。
空的construct.Struct 类对象序列化没有问题。
违规代码:
class FormatField(Construct):
def __init__(self,endianity,format):
if endianity not in list("=<>"):
raise FormatFieldError("endianity must be like: = < >",endianity)
if format not in list("fdBHLQbhlqe?"):
raise FormatFieldError("format must be like: f d B H L Q b h l q e ?",format)
super().__init__()
self.fmtstr = endianity+format
self.length = struct.calcsize(endianity+format)
self.packer = struct.Struct(endianity+format) # <---- culprit
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。