Skip to content

Session cache

session_cache

FunctionPickler

Bases: Pickler

Custom pickler that can serialize non-lambda functions by reference.

Source code in kfactory/session_cache.py
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
class FunctionPickler(pickle.Pickler):
    """Custom pickler that can serialize non-lambda functions by reference."""

    def reducer_override(self, obj: Any) -> Any:
        if isinstance(obj, types.FunctionType):
            if obj is _reconstruct_function or obj is _reconstruct_partial:
                return NotImplemented
            if obj.__name__ == "<lambda>":
                raise pickle.PicklingError(
                    "Cannot pickle lambda functions. Use a named function instead."
                )
            if "<locals>" in obj.__qualname__:
                raise pickle.PicklingError(
                    f"Cannot pickle nested function {obj.__qualname__!r}. "
                    "Use a module-level function instead."
                )
            return _reconstruct_function, (obj.__module__, obj.__qualname__)
        if isinstance(obj, functools.partial):
            return _reconstruct_partial, (obj.func, obj.args, obj.keywords)
        return NotImplemented

FunctionUnpickler

Bases: Unpickler

Custom unpickler paired with FunctionPickler.

Source code in kfactory/session_cache.py
71
72
class FunctionUnpickler(pickle.Unpickler):
    """Custom unpickler paired with FunctionPickler."""