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:
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