From e2583c48c978e16af25cd895c4285b3bc2dce710 Mon Sep 17 00:00:00 2001 From: Benedikt Bartscher Date: Sat, 7 Dec 2024 13:36:15 +0100 Subject: [PATCH 1/2] minor pickle improvement --- reflex/state.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/reflex/state.py b/reflex/state.py index 55f29cf45f3..0eec1e2c98c 100644 --- a/reflex/state.py +++ b/reflex/state.py @@ -2105,14 +2105,26 @@ def __getstate__(self): state["__dict__"].pop("router", None) state["__dict__"].pop("router_data", None) # Never serialize parent_state or substates. - state["__dict__"]["parent_state"] = None - state["__dict__"]["substates"] = {} + state["__dict__"].pop("parent_state", None) + state["__dict__"].pop("substates", None) state["__dict__"].pop("_was_touched", None) # Remove all inherited vars. for inherited_var_name in self.inherited_vars: state["__dict__"].pop(inherited_var_name, None) return state + def __setstate__(self, state: dict[str, Any]): + """Set the state from redis deserialization. + + This method is called by pickle to deserialize the object. + + Args: + state: The state dict for deserialization. + """ + state["__dict__"]["parent_state"] = None + state["__dict__"]["substates"] = {} + super().__setstate__(state) + def _check_state_size( self, pickle_state_size: int, From d5265ae55315ac4abba36e6b8f598bd8d9801e38 Mon Sep 17 00:00:00 2001 From: Benedikt Bartscher Date: Sun, 8 Dec 2024 00:39:06 +0100 Subject: [PATCH 2/2] more minor pickle improvements --- reflex/state.py | 4 ++++ tests/units/test_state.py | 5 +---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/reflex/state.py b/reflex/state.py index 0eec1e2c98c..54fe10fd73b 100644 --- a/reflex/state.py +++ b/reflex/state.py @@ -2107,6 +2107,8 @@ def __getstate__(self): # Never serialize parent_state or substates. state["__dict__"].pop("parent_state", None) state["__dict__"].pop("substates", None) + state["__dict__"].pop("dirty_vars", None) + state["__dict__"].pop("dirty_substates", None) state["__dict__"].pop("_was_touched", None) # Remove all inherited vars. for inherited_var_name in self.inherited_vars: @@ -2123,6 +2125,8 @@ def __setstate__(self, state: dict[str, Any]): """ state["__dict__"]["parent_state"] = None state["__dict__"]["substates"] = {} + state["__dict__"]["dirty_vars"] = set() + state["__dict__"]["dirty_substates"] = set() super().__setstate__(state) def _check_state_size( diff --git a/tests/units/test_state.py b/tests/units/test_state.py index 8e61b8dae7f..f7314446a4d 100644 --- a/tests/units/test_state.py +++ b/tests/units/test_state.py @@ -2513,10 +2513,7 @@ def test_mutable_copy(mutable_state: MutableTestState, copy_func: Callable): assert getattr(ms_copy, attr) is not getattr(mutable_state, attr) ms_copy.custom.array.append(42) assert "custom" in ms_copy.dirty_vars - if copy_func is copy.copy: - assert "custom" in mutable_state.dirty_vars - else: - assert not mutable_state.dirty_vars + assert not mutable_state.dirty_vars @pytest.mark.parametrize(