stdpy: pickle improvements

* Define __all__
* Define missing exception types
* clear_memo() now clears Panda-specific state as well
This commit is contained in:
rdb 2021-01-01 15:58:51 +01:00
parent 99f9352e76
commit 9cb129597c

View File

@ -21,6 +21,9 @@ shared context between all objects written by that Pickler.
Unfortunately, cPickle cannot be supported, because it does not Unfortunately, cPickle cannot be supported, because it does not
support extensions of this nature. """ support extensions of this nature. """
__all__ = ["PickleError", "PicklingError", "UnpicklingError", "Pickler",
"Unpickler", "dump", "dumps", "load", "loads"]
import sys import sys
from panda3d.core import BamWriter, BamReader, TypedObject from panda3d.core import BamWriter, BamReader, TypedObject
@ -33,7 +36,9 @@ else:
# with the local pickle.py. # with the local pickle.py.
pickle = __import__('pickle') pickle = __import__('pickle')
PickleError = pickle.PickleError
PicklingError = pickle.PicklingError PicklingError = pickle.PicklingError
UnpicklingError = pickle.UnpicklingError
if sys.version_info >= (3, 0): if sys.version_info >= (3, 0):
BasePickler = pickle._Pickler BasePickler = pickle._Pickler
@ -43,13 +48,18 @@ else:
BaseUnpickler = pickle.Unpickler BaseUnpickler = pickle.Unpickler
class _Pickler(BasePickler): class Pickler(BasePickler):
def __init__(self, *args, **kw): def __init__(self, *args, **kw):
self.bamWriter = BamWriter() self.bamWriter = BamWriter()
self._canonical = {} self._canonical = {}
BasePickler.__init__(self, *args, **kw) BasePickler.__init__(self, *args, **kw)
def clear_memo(self):
BasePickler.clear_memo(self)
self._canonical.clear()
self.bamWriter = BamWriter()
# We have to duplicate most of the save() method, so we can add # We have to duplicate most of the save() method, so we can add
# support for __reduce_persist__(). # support for __reduce_persist__().
@ -172,12 +182,6 @@ class Unpickler(BaseUnpickler):
BaseUnpickler.dispatch[pickle.REDUCE] = load_reduce BaseUnpickler.dispatch[pickle.REDUCE] = load_reduce
Pickler = _Pickler
if sys.version_info < (3, 0):
del _Pickler
# Shorthands # Shorthands
from io import BytesIO from io import BytesIO