|
36 | 36 | import codecs
|
37 | 37 | import _compat_pickle
|
38 | 38 |
|
39 |
| -from _pickle import PickleBuffer |
40 |
| - |
41 | 39 | __all__ = ["PickleError", "PicklingError", "UnpicklingError", "Pickler",
|
42 |
| - "Unpickler", "dump", "dumps", "load", "loads", "PickleBuffer"] |
| 40 | + "Unpickler", "dump", "dumps", "load", "loads"] |
| 41 | + |
| 42 | +try: |
| 43 | + from _pickle import PickleBuffer |
| 44 | + __all__.append("PickleBuffer") |
| 45 | + _HAVE_PICKLE_BUFFER = True |
| 46 | +except ImportError: |
| 47 | + _HAVE_PICKLE_BUFFER = False |
| 48 | + |
43 | 49 |
|
44 | 50 | # Shortcut for use in isinstance testing
|
45 | 51 | bytes_types = (bytes, bytearray)
|
@@ -812,31 +818,32 @@ def save_bytearray(self, obj):
|
812 | 818 | self.write(BYTEARRAY8 + pack("<Q", n) + obj)
|
813 | 819 | dispatch[bytearray] = save_bytearray
|
814 | 820 |
|
815 |
| - def save_picklebuffer(self, obj): |
816 |
| - if self.proto < 5: |
817 |
| - raise PicklingError("PickleBuffer can only pickled with " |
818 |
| - "protocol >= 5") |
819 |
| - with obj.raw() as m: |
820 |
| - if not m.contiguous: |
821 |
| - raise PicklingError("PickleBuffer can not be pickled when " |
822 |
| - "pointing to a non-contiguous buffer") |
823 |
| - in_band = True |
824 |
| - if self._buffer_callback is not None: |
825 |
| - in_band = bool(self._buffer_callback(obj)) |
826 |
| - if in_band: |
827 |
| - # Write data in-band |
828 |
| - # XXX The C implementation avoids a copy here |
829 |
| - if m.readonly: |
830 |
| - self.save_bytes(m.tobytes()) |
| 821 | + if _HAVE_PICKLE_BUFFER: |
| 822 | + def save_picklebuffer(self, obj): |
| 823 | + if self.proto < 5: |
| 824 | + raise PicklingError("PickleBuffer can only pickled with " |
| 825 | + "protocol >= 5") |
| 826 | + with obj.raw() as m: |
| 827 | + if not m.contiguous: |
| 828 | + raise PicklingError("PickleBuffer can not be pickled when " |
| 829 | + "pointing to a non-contiguous buffer") |
| 830 | + in_band = True |
| 831 | + if self._buffer_callback is not None: |
| 832 | + in_band = bool(self._buffer_callback(obj)) |
| 833 | + if in_band: |
| 834 | + # Write data in-band |
| 835 | + # XXX The C implementation avoids a copy here |
| 836 | + if m.readonly: |
| 837 | + self.save_bytes(m.tobytes()) |
| 838 | + else: |
| 839 | + self.save_bytearray(m.tobytes()) |
831 | 840 | else:
|
832 |
| - self.save_bytearray(m.tobytes()) |
833 |
| - else: |
834 |
| - # Write data out-of-band |
835 |
| - self.write(NEXT_BUFFER) |
836 |
| - if m.readonly: |
837 |
| - self.write(READONLY_BUFFER) |
| 841 | + # Write data out-of-band |
| 842 | + self.write(NEXT_BUFFER) |
| 843 | + if m.readonly: |
| 844 | + self.write(READONLY_BUFFER) |
838 | 845 |
|
839 |
| - dispatch[PickleBuffer] = save_picklebuffer |
| 846 | + dispatch[PickleBuffer] = save_picklebuffer |
840 | 847 |
|
841 | 848 | def save_str(self, obj):
|
842 | 849 | if self.bin:
|
|
0 commit comments