From a7355962fd4fd3bec50912297e7f15dbfd39cca1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Brand=C3=A9ho?= Date: Fri, 3 May 2024 21:13:57 +0200 Subject: [PATCH] prevent shadowing of computed vars (#3221) --- reflex/state.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/reflex/state.py b/reflex/state.py index e29aa1a98..4ee4fdb9a 100644 --- a/reflex/state.py +++ b/reflex/state.py @@ -450,6 +450,8 @@ class BaseState(Base, ABC, extra=pydantic.Extra.allow): super().__init_subclass__(**kwargs) # Event handlers should not shadow builtin state methods. cls._check_overridden_methods() + # Computed vars should not shadow builtin state props. + cls._check_overriden_basevars() # Reset subclass tracking for this class. cls.class_subclasses = set() @@ -696,6 +698,19 @@ class BaseState(Base, ABC, extra=pydantic.Extra.allow): f"The event handler name `{method_name}` shadows a builtin State method; use a different name instead" ) + @classmethod + def _check_overriden_basevars(cls): + """Check for shadow base vars and raise error if any. + + Raises: + NameError: When a computed var shadows a base var. + """ + for computed_var_ in cls._get_computed_vars(): + if computed_var_._var_name in cls.__annotations__: + raise NameError( + f"The computed var name `{computed_var_._var_name}` shadows a base var in {cls.__module__}.{cls.__name__}; use a different name instead" + ) + @classmethod def get_skip_vars(cls) -> set[str]: """Get the vars to skip when serializing.