From 01c2a1ed7dd3be37edf71ef483160dc369cdd177 Mon Sep 17 00:00:00 2001 From: Nikhil Rao Date: Mon, 29 Jan 2024 12:57:02 +0700 Subject: [PATCH] Set correct type when indexing into Var[str] (#2469) * Index into strings * Write tests --- reflex/vars.py | 9 ++++----- tests/test_var.py | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/reflex/vars.py b/reflex/vars.py index df2000276..3fba2bdde 100644 --- a/reflex/vars.py +++ b/reflex/vars.py @@ -572,11 +572,10 @@ class Var: ) # Get the type of the indexed var. - type_ = ( - types.get_args(self._var_type)[0] - if types.is_generic_alias(self._var_type) - else Any - ) + if types.is_generic_alias(self._var_type): + type_ = types.get_args(self._var_type)[0] + elif types._issubclass(self._var_type, str): + type_ = str # Use `at` to support negative indices. return self._replace( diff --git a/tests/test_var.py b/tests/test_var.py index 2441b13e9..5833e28f0 100644 --- a/tests/test_var.py +++ b/tests/test_var.py @@ -406,6 +406,22 @@ def test_var_indexing_lists(var): assert str(var[-1]) == f"{{{var._var_name}.at(-1)}}" +def test_var_indexing_str(): + """Test that we can index into str vars.""" + str_var = BaseVar(_var_name="str", _var_type=str) + + # Test that indexing gives a type of Var[str]. + assert isinstance(str_var[0], Var) + assert str_var[0]._var_type == str + + # Test basic indexing. + assert str(str_var[0]) == "{str.at(0)}" + assert str(str_var[1]) == "{str.at(1)}" + + # Test negative indexing. + assert str(str_var[-1]) == "{str.at(-1)}" + + @pytest.mark.parametrize( "var, index", [