Python 在pickle中使用“uuu getstate”uuuu/“uuu setstate”失败,原因是;ValueError:大小需要为(整数宽度、整数高度)";
我正在尝试picklePython 在pickle中使用“uuu getstate”uuuu/“uuu setstate”失败,原因是;ValueError:大小需要为(整数宽度、整数高度)";,python,pygame,pickle,getstate,Python,Pygame,Pickle,Getstate,我正在尝试picklepygame.Surface对象,默认情况下该对象不可pickle。我所做的是将经典的picklability函数添加到类中并覆盖它。这样,它将与我的其余代码一起工作 class TemporarySurface(pygame.Surface): def __getstate__(self): print '__getstate__ executed' return (pygame.image.tostring(self,IMAGE_
pygame.Surface
对象,默认情况下该对象不可pickle。我所做的是将经典的picklability函数添加到类中并覆盖它。这样,它将与我的其余代码一起工作
class TemporarySurface(pygame.Surface):
def __getstate__(self):
print '__getstate__ executed'
return (pygame.image.tostring(self,IMAGE_TO_STRING_FORMAT),self.get_size())
def __setstate__(self,state):
print '__setstate__ executed'
tempsurf = pygame.image.frombuffer(state[0],state[1],IMAGE_TO_STRING_FORMAT)
pygame.Surface.__init__(self,tempsurf)
pygame.Surface = TemporarySurface
下面是我尝试pickle几个递归对象时的回溯示例:
Traceback (most recent call last):
File "dibujar.py", line 981, in save_project
pickler.dump((key,value))
File "/usr/lib/python2.7/pickle.py", line 224, in dump
self.save(obj)
File "/usr/lib/python2.7/pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "/usr/lib/python2.7/pickle.py", line 562, in save_tuple
save(element)
File "/usr/lib/python2.7/pickle.py", line 306, in save
rv = reduce(self.proto)
File "/usr/lib/python2.7/copy_reg.py", line 71, in _reduce_ex
state = base(self)
ValueError: size needs to be (int width, int height)
让我困惑的是print语句没有被执行。\uuu getstate\uuu
是否被调用?我在这里感到困惑,我也不确定应该提供什么信息。请告诉我是否有其他帮助。因为,酸洗扩展类型的主要入口点是\uuuuuuuuuuuuuuuuu
或方法。鉴于此错误,默认的\uuuu reduce\uuu
实现似乎与pygame.Surface
的构造函数不兼容
因此,您最好为曲面
提供一个\uuuu reduce\uuuu
方法,或者通过复制
模块在外部注册一个方法。我建议后者,因为它不涉及猴子修补。您可能需要以下内容:
import copy_reg
def pickle_surface(surface):
return construct_surface, (pygame.image.tostring(surface, IMAGE_TO_STRING_FORMAT), surface.get_size())
def construct_surface(data, size):
return pygame.image.frombuffer(data, size, IMAGE_TO_STRING_FORMAT)
construct_surface.__safe_for_unpickling__ = True
copy_reg.pickle(pygame.Surface, pickle_surface)
这就是你所需要的。确保模块的顶层有construct\u surface
功能:取消勾选过程需要能够定位该功能,以便执行取消勾选过程(可能发生在不同的解释器实例中)。,酸洗扩展类型的主要入口点是\uuuuu reduce\uuuu
或\uuuu reduce\uu ex\uuuu
方法。鉴于此错误,默认的\uuuu reduce\uuu
实现似乎与pygame.Surface
的构造函数不兼容
因此,您最好为曲面
提供一个\uuuu reduce\uuuu
方法,或者通过复制
模块在外部注册一个方法。我建议后者,因为它不涉及猴子修补。您可能需要以下内容:
import copy_reg
def pickle_surface(surface):
return construct_surface, (pygame.image.tostring(surface, IMAGE_TO_STRING_FORMAT), surface.get_size())
def construct_surface(data, size):
return pygame.image.frombuffer(data, size, IMAGE_TO_STRING_FORMAT)
construct_surface.__safe_for_unpickling__ = True
copy_reg.pickle(pygame.Surface, pickle_surface)
这就是你所需要的。但是,请确保模块的顶层有construct\u surface
函数可用:取消勾选过程需要能够找到该函数,以便执行取消勾选过程(这可能发生在不同的解释器实例中)。它可能不会被调用,取决于不同代码段导入曲面的方式。如何使用Surface
?您是否可以使用子类而不是monkeypatchingSurface
本身?好吧,我使用的是其他人的代码,这些代码在Surface对象周围传递,因此使用子类对我来说要困难得多。Surface正在正常使用,我只是在尝试对其进行pickle时遇到此错误。我发现了此错误:但是,您是否能够检索文件路径或id,并将其保存而不是实际像素?可能无法调用它,具体取决于不同的代码段导入Surface
的方式。如何使用Surface
?您是否可以使用子类而不是monkeypatchingSurface
本身?好吧,我使用的是其他人的代码,这些代码在Surface对象周围传递,因此使用子类对我来说要困难得多。曲面正在正常使用,我只是在尝试对其进行pickle时遇到此错误。我发现了此错误:但是,您是否能够检索文件路径或id,并将其保存而不是实际像素?