瀏覽代碼

`State.get_var_value` should never return a Var (#5117)

Because ObjectVar may support arbitrary attribute access, a non-Literal
ObjectVar returns something for getattr(var, _var_value), which isn't actually
a dict value.
Masen Furer 1 月之前
父節點
當前提交
06a3beb029
共有 2 個文件被更改,包括 10 次插入2 次删除
  1. 3 1
      reflex/state.py
  2. 7 1
      tests/units/test_state.py

+ 3 - 1
reflex/state.py

@@ -1564,7 +1564,9 @@ class BaseState(Base, ABC, extra=pydantic.Extra.allow):
         unset = object()
 
         # Fast case: this is a literal var and the value is known.
-        if (var_value := getattr(var, "_var_value", unset)) is not unset:
+        if (
+            var_value := getattr(var, "_var_value", unset)
+        ) is not unset and not isinstance(var_value, Var):
             return var_value  # pyright: ignore [reportReturnType]
 
         var_data = var._get_all_var_data()

+ 7 - 1
tests/units/test_state.py

@@ -111,7 +111,7 @@ class TestState(BaseState):
     key: str
     map_key: str = "a"
     array: list[float] = [1, 2, 3.14]
-    mapping: dict[str, list[int]] = {"a": [1, 2, 3], "b": [4, 5, 6]}
+    mapping: rx.Field[dict[str, list[int]]] = rx.field({"a": [1, 2, 3], "b": [4, 5, 6]})
     obj: Object = Object()
     complex: dict[int, Object] = {1: Object(), 2: Object()}
     fig: Figure = Figure()
@@ -3869,6 +3869,12 @@ async def test_get_var_value(state_manager: StateManager, substate_token: str):
     with pytest.raises(UnretrievableVarValueError):
         await state.get_var_value(rx.Var("undefined"))
 
+    # ObjectVar
+    assert await state.get_var_value(TestState.mapping) == {
+        "a": [1, 2, 3],
+        "b": [4, 5, 6],
+    }
+
 
 @pytest.mark.asyncio
 async def test_async_computed_var_get_state(mock_app: rx.App, token: str):