浏览代码

code review

Falko Schindler 1 年之前
父节点
当前提交
1738078f16
共有 2 个文件被更改,包括 56 次插入45 次删除
  1. 19 10
      nicegui/events.py
  2. 37 35
      nicegui/observables.py

+ 19 - 10
nicegui/events.py

@@ -1,24 +1,35 @@
+from __future__ import annotations
+
+from contextlib import nullcontext
 from dataclasses import dataclass
 from inspect import Parameter, signature
-from typing import TYPE_CHECKING, Any, Awaitable, BinaryIO, Callable, Dict, List, Literal, Optional
-from contextlib import nullcontext
+from typing import TYPE_CHECKING, Any, Awaitable, BinaryIO, Callable, Dict, List, Literal, Optional, Union
 
 from . import background_tasks, globals
 from .helpers import KWONLY_SLOTS
+from .slot import Slot
 
 if TYPE_CHECKING:
     from .client import Client
     from .element import Element
+    from .observables import ObservableDict, ObservableList, ObservableSet
 
 
 @dataclass(**KWONLY_SLOTS)
 class EventArguments:
     pass
 
+
+@dataclass(**KWONLY_SLOTS)
+class ObservableChangeEventArguments(EventArguments):
+    sender: Union[ObservableDict, ObservableList, ObservableSet]
+
+
 @dataclass(**KWONLY_SLOTS)
 class UiEventArguments(EventArguments):
-    sender: 'Element'
-    client: 'Client'
+    sender: Element
+    client: Client
+
 
 @dataclass(**KWONLY_SLOTS)
 class GenericEventArguments(UiEventArguments):
@@ -36,10 +47,6 @@ class GenericEventArguments(UiEventArguments):
 class ClickEventArguments(UiEventArguments):
     pass
 
-@dataclass(**KWONLY_SLOTS)
-class ObservableChangeEventArguments(EventArguments):
-    ...
-
 
 @dataclass(**KWONLY_SLOTS)
 class ChartEventArguments(EventArguments):
@@ -352,14 +359,16 @@ def handle_event(handler: Optional[Callable[..., Any]], arguments: EventArgument
                                 p.kind is not Parameter.VAR_POSITIONAL and
                                 p.kind is not Parameter.VAR_KEYWORD
                                 for p in signature(handler).parameters.values())
+
+        parent_slot: Union[Slot, nullcontext]
         if isinstance(arguments, UiEventArguments):
             if arguments.sender.is_ignoring_events:
                 return
+            assert arguments.sender.parent_slot is not None
             parent_slot = arguments.sender.parent_slot
         else:
             parent_slot = nullcontext()
-        
-        assert parent_slot is not None
+
         with parent_slot:
             result = handler(arguments) if expects_arguments else handler()
         if isinstance(result, Awaitable):

+ 37 - 35
nicegui/observables.py

@@ -1,51 +1,53 @@
 from typing import Any, Callable, Dict, Iterable, List, Set, SupportsIndex, Union, overload
+
 from . import events
 
+
 class ObservableDict(dict):
 
     def __init__(self, data: Dict, on_change: Callable) -> None:
         super().__init__(data)
         for key, value in self.items():
             super().__setitem__(key, make_observable(value, on_change))
-        self.on_change = on_change
+        self.on_change = lambda: events.handle_event(on_change, events.ObservableChangeEventArguments(sender=self))
 
     def pop(self, k: Any, d: Any = None) -> Any:
         item = super().pop(k, d)
-        events.handle_event(self.on_change, None)
+        self.on_change()
         return item
 
     def popitem(self) -> Any:
         item = super().popitem()
-        events.handle_event(self.on_change, None)
+        self.on_change()
         return item
 
     def update(self, *args: Any, **kwargs: Any) -> None:
         super().update(make_observable(dict(*args, **kwargs), self.on_change))
-        events.handle_event(self.on_change, None)
+        self.on_change()
 
     def clear(self) -> None:
         super().clear()
-        events.handle_event(self.on_change, None)
+        self.on_change()
 
     def setdefault(self, __key: Any, __default: Any = None) -> Any:
         item = super().setdefault(__key, make_observable(__default, self.on_change))
-        events.handle_event(self.on_change, None)
+        self.on_change()
         return item
 
     def __setitem__(self, __key: Any, __value: Any) -> None:
         super().__setitem__(__key, make_observable(__value, self.on_change))
-        events.handle_event(self.on_change, None)
+        self.on_change()
 
     def __delitem__(self, __key: Any) -> None:
         super().__delitem__(__key)
-        events.handle_event(self.on_change, None)
+        self.on_change()
 
     def __or__(self, other: Any) -> Any:
         return super().__or__(other)
 
     def __ior__(self, other: Any) -> Any:
         super().__ior__(make_observable(dict(other), self.on_change))
-        events.handle_event(self.on_change, None)
+        self.on_change()
         return self
 
 
@@ -55,55 +57,55 @@ class ObservableList(list):
         super().__init__(data)
         for i, item in enumerate(self):
             super().__setitem__(i, make_observable(item, on_change))
-        self.on_change = on_change
+        self.on_change = lambda: events.handle_event(on_change, events.ObservableChangeEventArguments(sender=self))
 
     def append(self, item: Any) -> None:
         super().append(make_observable(item, self.on_change))
-        events.handle_event(self.on_change, None)
+        self.on_change()
 
     def extend(self, iterable: Iterable) -> None:
         super().extend(make_observable(list(iterable), self.on_change))
-        events.handle_event(self.on_change, None)
+        self.on_change()
 
     def insert(self, index: SupportsIndex, object: Any) -> None:
         super().insert(index, make_observable(object, self.on_change))
-        events.handle_event(self.on_change, None)
+        self.on_change()
 
     def remove(self, value: Any) -> None:
         super().remove(value)
-        events.handle_event(self.on_change, None)
+        self.on_change()
 
     def pop(self, index: SupportsIndex = -1) -> Any:
         item = super().pop(index)
-        events.handle_event(self.on_change, None)
+        self.on_change()
         return item
 
     def clear(self) -> None:
         super().clear()
-        events.handle_event(self.on_change, None)
+        self.on_change()
 
     def sort(self, **kwargs: Any) -> None:
         super().sort(**kwargs)
-        events.handle_event(self.on_change, None)
+        self.on_change()
 
     def reverse(self) -> None:
         super().reverse()
-        events.handle_event(self.on_change, None)
+        self.on_change()
 
     def __delitem__(self, key: Union[SupportsIndex, slice]) -> None:
         super().__delitem__(key)
-        events.handle_event(self.on_change, None)
+        self.on_change()
 
     def __setitem__(self, key: Union[SupportsIndex, slice], value: Any) -> None:
         super().__setitem__(key, make_observable(value, self.on_change))
-        events.handle_event(self.on_change, None)
+        self.on_change()
 
     def __add__(self, other: Any) -> Any:
         return super().__add__(other)
 
     def __iadd__(self, other: Any) -> Any:
         super().__iadd__(make_observable(other, self.on_change))
-        events.handle_event(self.on_change, None)
+        self.on_change()
         return self
 
 
@@ -113,51 +115,51 @@ class ObservableSet(set):
         super().__init__(data)
         for item in self:
             super().add(make_observable(item, on_change))
-        self.on_change = on_change
+        self.on_change = lambda: events.handle_event(on_change, events.ObservableChangeEventArguments(sender=self))
 
     def add(self, item: Any) -> None:
         super().add(make_observable(item, self.on_change))
-        events.handle_event(self.on_change, None)
+        self.on_change()
 
     def remove(self, item: Any) -> None:
         super().remove(item)
-        events.handle_event(self.on_change, None)
+        self.on_change()
 
     def discard(self, item: Any) -> None:
         super().discard(item)
-        events.handle_event(self.on_change, None)
+        self.on_change()
 
     def pop(self) -> Any:
         item = super().pop()
-        events.handle_event(self.on_change, None)
+        self.on_change()
         return item
 
     def clear(self) -> None:
         super().clear()
-        events.handle_event(self.on_change, None)
+        self.on_change()
 
     def update(self, *s: Iterable[Any]) -> None:
         super().update(make_observable(set(*s), self.on_change))
-        events.handle_event(self.on_change, None)
+        self.on_change()
 
     def intersection_update(self, *s: Iterable[Any]) -> None:
         super().intersection_update(*s)
-        events.handle_event(self.on_change, None)
+        self.on_change()
 
     def difference_update(self, *s: Iterable[Any]) -> None:
         super().difference_update(*s)
-        events.handle_event(self.on_change, None)
+        self.on_change()
 
     def symmetric_difference_update(self, *s: Iterable[Any]) -> None:
         super().symmetric_difference_update(*s)
-        events.handle_event(self.on_change, None)
+        self.on_change()
 
     def __or__(self, other: Any) -> Any:
         return super().__or__(other)
 
     def __ior__(self, other: Any) -> Any:
         super().__ior__(make_observable(other, self.on_change))
-        events.handle_event(self.on_change, None)
+        self.on_change()
         return self
 
     def __and__(self, other: Any) -> set:
@@ -165,7 +167,7 @@ class ObservableSet(set):
 
     def __iand__(self, other: Any) -> Any:
         super().__iand__(make_observable(other, self.on_change))
-        events.handle_event(self.on_change, None)
+        self.on_change()
         return self
 
     def __sub__(self, other: Any) -> set:
@@ -173,7 +175,7 @@ class ObservableSet(set):
 
     def __isub__(self, other: Any) -> Any:
         super().__isub__(make_observable(other, self.on_change))
-        events.handle_event(self.on_change, None)
+        self.on_change()
         return self
 
     def __xor__(self, other: Any) -> set:
@@ -181,7 +183,7 @@ class ObservableSet(set):
 
     def __ixor__(self, other: Any) -> Any:
         super().__ixor__(make_observable(other, self.on_change))
-        events.handle_event(self.on_change, None)
+        self.on_change()
         return self