pymake

A build system based on Build Systems à la Carte
git clone https://git.grace.moe/pymake
Log | Files | Refs | README

commit 078b4e2875257e2c5e63dd93fcc4fbd96e46542e
parent 8289191d3e83a217c8c5753c45920c4263151cd2
Author: gracefu <81774659+gracefuu@users.noreply.github.com>
Date:   Wed, 23 Apr 2025 02:10:50 +0800

Make function pickling a normal class again

Diffstat:
Mmake3/pickler.py | 40+++++++++++++---------------------------
Mmake3/rebuild.py | 11++++++-----
Mtar-sketch/a.txt | 2+-
3 files changed, 20 insertions(+), 33 deletions(-)

diff --git a/make3/pickler.py b/make3/pickler.py @@ -67,34 +67,20 @@ def unpickle_function_type(code, mod_name, closure): ) -class BasePickler(pickle.Pickler): +class FunctionPickler(pickle.Pickler): dispatch_table = copyreg.dispatch_table.copy() - - def reducer_override(self, _): # type: ignore - return NotImplemented - - -def FunctionPicklerAddon(pickler: type[BasePickler]): - class Wrapper(pickler): - dispatch_table = pickler.dispatch_table.copy() - dispatch_table[CodeType] = pickle_code_type - dispatch_table[CellType] = pickle_cell_type - - def reducer_override(self, obj): # type: ignore - if type(obj) is not FunctionType: - return super().reducer_override(obj) - obj_mod = inspect.getmodule(obj) - if obj_mod is None: - return super().reducer_override(obj) - if obj.__name__ in dir(obj_mod): - return super().reducer_override(obj) - return pickle_function_type(obj) - - return Wrapper - - -MakePickler = BasePickler -MakePickler = FunctionPicklerAddon(MakePickler) + dispatch_table[CodeType] = pickle_code_type + dispatch_table[CellType] = pickle_cell_type + + def reducer_override(self, obj): # type: ignore + if type(obj) is not FunctionType: + return NotImplemented + obj_mod = inspect.getmodule(obj) + if obj_mod is None: + return NotImplemented + if obj.__name__ in dir(obj_mod): + return NotImplemented + return pickle_function_type(obj) def pickle_with(pickler_cls: type, obj: Any) -> bytes: diff --git a/make3/rebuild.py b/make3/rebuild.py @@ -1,4 +1,4 @@ -from .pickler import MakePickler, pickle_with +from .pickler import FunctionPickler, pickle_with from typing import Any, Callable, overload import contextvars import functools @@ -16,10 +16,12 @@ def with_rerun_context(rerun_changes, f, /, *args, **kwargs): @overload -def rerun_if_changed(now: Callable, *, pickler_cls: type = MakePickler): ... +def rerun_if_changed(now: Callable, *, pickler_cls: type = FunctionPickler): ... @overload -def rerun_if_changed(now: Any, later: Callable, *, pickler_cls: type = MakePickler): ... -def rerun_if_changed(now, later=None, *, pickler_cls=MakePickler): +def rerun_if_changed( + now: Any, later: Callable, *, pickler_cls: type = FunctionPickler +): ... +def rerun_if_changed(now, later=None, *, pickler_cls=FunctionPickler): later_pkl = pickle_with(pickler_cls, now if later is None else later) rerun_changes_var.get().append((now() if later is None else now, later_pkl)) @@ -99,5 +101,4 @@ class Rerunner: self.db_file.seek(0) self.db_file.truncate(0) pickle.dump(self.db, self.db_file) - # MakePickler(self.db_file).dump(self.db) self.db_file.__exit__(ty, exc, tb) diff --git a/tar-sketch/a.txt b/tar-sketch/a.txt @@ -1 +1 @@ -Mon Apr 21 01:34:11 AM +08 2025 +Wed Apr 23 02:53:06 AM +08 2025