Python 3.8+pickleпонятие
pickle.PickleBuffer
внешние буферы
Обёртка над буфером (bytes, bytearray, memoryview), позволяющая протоколу 5 передавать большие данные вне основного потока pickle без копирования.
Синтаксис
pickle.dumps(pickle.PickleBuffer(buf), protocol=5, buffer_callback=callback)
Инструмент для авторов библиотек вроде NumPy, а не для повседневного кода. Работает только с protocol=5: на младших протоколах dumps поднимет PicklingError. Без buffer_callback буфер просто копируется внутрь pickle; с ним он отдаётся колбэку отдельно, и загрузить такие данные можно только loads(data, buffers=...), иначе UnpicklingError. Загрузка, как и у всего pickle, исполняет код из данных — только доверенный источник.
Примеры
import pickle
data = bytearray(b'big payload')
side = []
blob = pickle.dumps(pickle.PickleBuffer(data), protocol=5, buffer_callback=side.append)
print(len(side)) # → 1
print(bytes(pickle.loads(blob, buffers=side))) # → b'big payload'
try:
pickle.loads(blob)
except pickle.UnpicklingError as e:
print(type(e).__name__) # → UnpicklingError
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности