46 lines
1.5 KiB
Python
46 lines
1.5 KiB
Python
"""
|
|
This module is here to ensure compatibility of Windows/Linux/MacOS and
|
|
different Python versions.
|
|
"""
|
|
import errno
|
|
import sys
|
|
import pickle
|
|
from typing import Any
|
|
|
|
|
|
class Unpickler(pickle.Unpickler):
|
|
def find_class(self, module: str, name: str) -> Any:
|
|
# Python 3.13 moved pathlib implementation out of __init__.py as part of
|
|
# generalising its implementation. Ensure that we support loading
|
|
# pickles from 3.13 on older version of Python. Since 3.13 maintained a
|
|
# compatible API, pickles from older Python work natively on the newer
|
|
# version.
|
|
if module == 'pathlib._local':
|
|
module = 'pathlib'
|
|
return super().find_class(module, name)
|
|
|
|
|
|
def pickle_load(file):
|
|
try:
|
|
return Unpickler(file).load()
|
|
# Python on Windows don't throw EOF errors for pipes. So reraise them with
|
|
# the correct type, which is caught upwards.
|
|
except OSError:
|
|
if sys.platform == 'win32':
|
|
raise EOFError()
|
|
raise
|
|
|
|
|
|
def pickle_dump(data, file, protocol):
|
|
try:
|
|
pickle.dump(data, file, protocol)
|
|
# On Python 3.3 flush throws sometimes an error even though the writing
|
|
# operation should be completed.
|
|
file.flush()
|
|
# Python on Windows don't throw EPIPE errors for pipes. So reraise them with
|
|
# the correct type and error number.
|
|
except OSError:
|
|
if sys.platform == 'win32':
|
|
raise IOError(errno.EPIPE, "Broken pipe")
|
|
raise
|