Procházet zdrojové kódy

allow event handlers to be turned into vars (#5032)

* allow event handlers to be turned into vars

* change exception name

* s2
Khaleel Al-Adhami před 1 měsícem
rodič
revize
4da96e3d69
2 změnil soubory, kde provedl 22 přidání a 3 odebrání
  1. 17 2
      reflex/event.py
  2. 5 1
      tests/units/test_event.py

+ 17 - 2
reflex/event.py

@@ -1607,7 +1607,7 @@ def get_fn_signature(fn: Callable) -> inspect.Signature:
     return signature.replace(parameters=(new_param, *signature.parameters.values()))
 
 
-class EventVar(ObjectVar, python_types=EventSpec):
+class EventVar(ObjectVar, python_types=(EventSpec, EventHandler)):
     """Base class for event vars."""
 
 
@@ -1632,7 +1632,7 @@ class LiteralEventVar(VarOperationCall, LiteralVar, EventVar):
     @classmethod
     def create(
         cls,
-        value: EventSpec,
+        value: EventSpec | EventHandler,
         _var_data: VarData | None = None,
     ) -> LiteralEventVar:
         """Create a new LiteralEventVar instance.
@@ -1643,7 +1643,22 @@ class LiteralEventVar(VarOperationCall, LiteralVar, EventVar):
 
         Returns:
             The created LiteralEventVar instance.
+
+        Raises:
+            EventFnArgMismatchError: If the event handler takes arguments.
         """
+        if isinstance(value, EventHandler):
+
+            def no_args():
+                return ()
+
+            try:
+                value = call_event_handler(value, no_args)
+            except EventFnArgMismatchError:
+                raise EventFnArgMismatchError(
+                    f"Event handler {value.fn.__qualname__} used inside of a rx.cond() must not take any arguments."
+                ) from None
+
         return cls(
             _js_expr="",
             _var_type=EventSpec,

+ 5 - 1
tests/units/test_event.py

@@ -431,8 +431,12 @@ def test_event_var_data():
         def s(self, value: int):
             pass
 
+        @event
+        def s2(self):
+            pass
+
     # Handler doesn't have any _var_data because it's just a str
-    handler_var = Var.create(S.s)
+    handler_var = Var.create(S.s2)
     assert handler_var._get_all_var_data() is None
 
     # Ensure spec carries _var_data