pygame.Surface
デフォルトではピクル可能ではないオブジェクトをピクルしようとしています。私が行ったことは、古典的な 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
いくつかの再帰オブジェクトをピクルしようとしたときのトレースバックの例を次に示します。
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 ステートメントが実行されていないことです。__getstate__
呼ばれていますか?ここで混乱しており、どの情報を掲載すればよいか正確にはわかりません。追加の何かが役立つかどうか教えてください。