Przeglądaj źródła

replace "msg" dict with GenericEventArguments

Falko Schindler 1 rok temu
rodzic
commit
246404d454
2 zmienionych plików z 20 dodań i 10 usunięć
  1. 2 1
      nicegui/element.py
  2. 18 9
      nicegui/events.py

+ 2 - 1
nicegui/element.py

@@ -243,7 +243,8 @@ class Element(Visibility):
     def _handle_event(self, msg: Dict) -> None:
     def _handle_event(self, msg: Dict) -> None:
         listener = self._event_listeners[msg['listener_id']]
         listener = self._event_listeners[msg['listener_id']]
         storage.request_contextvar.set(listener.request)
         storage.request_contextvar.set(listener.request)
-        events.handle_event(listener.handler, msg, sender=self)
+        args = events.GenericEventArguments(sender=self, client=self.client, args=msg['args'])
+        events.handle_event(listener.handler, args)
 
 
     def update(self) -> None:
     def update(self) -> None:
         """Update the element on the client side."""
         """Update the element on the client side."""

+ 18 - 9
nicegui/events.py

@@ -1,6 +1,6 @@
 from dataclasses import dataclass
 from dataclasses import dataclass
 from inspect import Parameter, signature
 from inspect import Parameter, signature
-from typing import TYPE_CHECKING, Any, Awaitable, BinaryIO, Callable, Dict, List, Optional, Union
+from typing import TYPE_CHECKING, Any, Awaitable, BinaryIO, Callable, Dict, List, Optional
 
 
 from . import background_tasks, globals
 from . import background_tasks, globals
 from .helpers import KWONLY_SLOTS
 from .helpers import KWONLY_SLOTS
@@ -16,6 +16,18 @@ class EventArguments:
     client: 'Client'
     client: 'Client'
 
 
 
 
+@dataclass(**KWONLY_SLOTS)
+class GenericEventArguments(EventArguments):
+    args: Dict[str, Any]
+
+    def __getitem__(self, key: str) -> Any:
+        if key == 'args':
+            globals.log.warning('msg["args"] is deprecated, use e.args instead '
+                                '(see https://github.com/zauberzeug/nicegui/pull/1095)')
+            return self.args
+        raise KeyError(key)
+
+
 @dataclass(**KWONLY_SLOTS)
 @dataclass(**KWONLY_SLOTS)
 class ClickEventArguments(EventArguments):
 class ClickEventArguments(EventArguments):
     pass
     pass
@@ -268,22 +280,19 @@ class KeyEventArguments(EventArguments):
     modifiers: KeyboardModifiers
     modifiers: KeyboardModifiers
 
 
 
 
-def handle_event(handler: Optional[Callable[..., Any]],
-                 arguments: Union[EventArguments, Dict], *,
-                 sender: Optional['Element'] = None) -> None:
+def handle_event(handler: Optional[Callable[..., Any]], arguments: EventArguments) -> None:
     if handler is None:
     if handler is None:
         return
         return
     try:
     try:
         no_arguments = not any(p.default is Parameter.empty for p in signature(handler).parameters.values())
         no_arguments = not any(p.default is Parameter.empty for p in signature(handler).parameters.values())
-        sender = arguments.sender if isinstance(arguments, EventArguments) else sender
-        assert sender is not None and sender.parent_slot is not None
-        if sender.is_ignoring_events:
+        assert arguments.sender.parent_slot is not None
+        if arguments.sender.is_ignoring_events:
             return
             return
-        with sender.parent_slot:
+        with arguments.sender.parent_slot:
             result = handler() if no_arguments else handler(arguments)
             result = handler() if no_arguments else handler(arguments)
         if isinstance(result, Awaitable):
         if isinstance(result, Awaitable):
             async def wait_for_result():
             async def wait_for_result():
-                with sender.parent_slot:
+                with arguments.sender.parent_slot:
                     await result
                     await result
             if globals.loop and globals.loop.is_running():
             if globals.loop and globals.loop.is_running():
                 background_tasks.create(wait_for_result(), name=str(handler))
                 background_tasks.create(wait_for_result(), name=str(handler))