From d959e0b83006d5f2349a738c73042581edc600e8 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 22 Oct 2026 00:53:47 +0000 Subject: [PATCH] Revert "fix(vars): accept a frozenset as an array literal (#7622)" This reverts commit 54c9aa6792b270463f13ebb12b22c64b780fbcab. Treating a set or frozenset as an ArrayVar is the wrong direction: sets are not sequences, and the operations users want on them (membership, add, union) are not array operations. A dedicated SetVar backed by the JS Set object is tracked in #7623 instead. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_014RnswbLCA27Ku2CxbJs58d --- .../reflex-base/news/+frozenset-literal.bugfix.md | 1 - packages/reflex-base/src/reflex_base/vars/base.py | 9 +++------ .../reflex-base/src/reflex_base/vars/sequence.py | 3 +-- tests/units/test_var.py | 15 --------------- 4 files changed, 4 insertions(+), 24 deletions(-) delete mode 100644 packages/reflex-base/news/+frozenset-literal.bugfix.md diff --git a/packages/reflex-base/news/+frozenset-literal.bugfix.md b/packages/reflex-base/news/+frozenset-literal.bugfix.md deleted file mode 100644 index e76dd1a0bee..00000000000 --- a/packages/reflex-base/news/+frozenset-literal.bugfix.md +++ /dev/null @@ -1 +0,0 @@ -`LiteralVar.create` now accepts a `frozenset`, rendered as an array like a `set`, with its element type inferred so `rx.foreach` and array operations over it are typed. diff --git a/packages/reflex-base/src/reflex_base/vars/base.py b/packages/reflex-base/src/reflex_base/vars/base.py index e23795d5ec9..c2e70cdba15 100644 --- a/packages/reflex-base/src/reflex_base/vars/base.py +++ b/packages/reflex-base/src/reflex_base/vars/base.py @@ -2174,7 +2174,7 @@ def figure_out_type(value: Any) -> types.GenericType: Returns: The type of the value. """ - if isinstance(value, (list, set, frozenset, tuple, Mapping, Var)): + if isinstance(value, (list, set, tuple, Mapping, Var)): if isinstance(value, Var): return value._var_type if has_args(value_type := type(value)): @@ -2183,11 +2183,8 @@ def figure_out_type(value: Any) -> types.GenericType: if not value: return Sequence[NoReturn] return Sequence[unionize(*{figure_out_type(v) for v in value[:100]})] - if isinstance(value, (set, frozenset)): - element_type = unionize(*{figure_out_type(v) for v in value}) - if isinstance(value, frozenset): - return frozenset[element_type] - return set[element_type] + if isinstance(value, set): + return set[unionize(*{figure_out_type(v) for v in value})] if isinstance(value, tuple): if not value: return tuple[NoReturn, ...] diff --git a/packages/reflex-base/src/reflex_base/vars/sequence.py b/packages/reflex-base/src/reflex_base/vars/sequence.py index 6798fa0cc9c..1ded6c57ab1 100644 --- a/packages/reflex-base/src/reflex_base/vars/sequence.py +++ b/packages/reflex-base/src/reflex_base/vars/sequence.py @@ -63,7 +63,7 @@ VALUE_TYPE = TypeVar("VALUE_TYPE") -class ArrayVar(Var[ARRAY_VAR_TYPE], python_types=(Sequence, set, frozenset)): +class ArrayVar(Var[ARRAY_VAR_TYPE], python_types=(Sequence, set)): """Base class for immutable array vars.""" def join(self, sep: StringVar | str = "") -> StringVar: @@ -1920,7 +1920,6 @@ def _determine_value_of_array_index( Iterable, list, set, - frozenset, collections.abc.Sequence, collections.abc.Iterable, ]: diff --git a/tests/units/test_var.py b/tests/units/test_var.py index b7f81370f27..fe0639d53ac 100644 --- a/tests/units/test_var.py +++ b/tests/units/test_var.py @@ -51,7 +51,6 @@ ConcatVarOperation, LiteralArrayVar, LiteralStringVar, - StringVar, ) import reflex as rx @@ -422,19 +421,6 @@ def test_date_comparison_uses_compare_datetime(): assert str(lhs == rhs) == '(compareDatetime("2024-01-01", "2024-01-02") === 0)' -def test_frozenset_literal_types_its_elements(): - """A frozen set literal infers its element type like a set does.""" - # The static array bound is Sequence, which no set satisfies; see the PR. - var = cast(ArrayVar, v(frozenset({"a"}))) - - assert var._var_type == frozenset[str] - assert isinstance(var[0], StringVar) - assert re.fullmatch( - r'\["a"\]\.map\(\(\((\w+)\) => \1\.toUpperCase\(\)\)\)', - str(var.map(lambda item: item.upper())), - ) - - def test_datetime_equality_with_other_type_uses_default_comparison(): value = v(datetime(2024, 1, 1)) expected_equality = ( @@ -450,7 +436,6 @@ def test_datetime_equality_with_other_type_uses_default_comparison(): [ (v([1, 2, 3]), "[1, 2, 3]"), (v({1, 2, 3}), "[1, 2, 3]"), - (v(frozenset({1, 2, 3})), "[1, 2, 3]"), (v(["1", "2", "3"]), '["1", "2", "3"]'), ( Var(_js_expr="foo")._var_set_state("state").to(list),