You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			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
 |