use the dict to store the receivers in signal

This commit is contained in:
huangsong
2021-12-21 17:00:14 +08:00
parent 070ff023a0
commit 94c5b23204

View File

@ -45,7 +45,7 @@ class Signal:
""" """
def __init__(self) -> None: def __init__(self) -> None:
self._receivers: List[Tuple[Union[int, Tuple[int, int]], Callable]] = [] self._receivers: Dict[Tuple[Union[int, Tuple[int, int]]], Callable] = {}
def connect(self, receiver: Callable) -> None: def connect(self, receiver: Callable) -> None:
""" """
@ -63,8 +63,8 @@ class Signal:
"Signal receivers must accept **kwargs argument." "Signal receivers must accept **kwargs argument."
) )
new_receiver_key = make_id(receiver) new_receiver_key = make_id(receiver)
if not any(rec_id == new_receiver_key for rec_id, _ in self._receivers): if new_receiver_key not in self._receivers:
self._receivers.append((new_receiver_key, receiver)) self._receivers[new_receiver_key] = receiver
def disconnect(self, receiver: Callable) -> bool: def disconnect(self, receiver: Callable) -> bool:
""" """
@ -75,15 +75,9 @@ class Signal:
:return: flag if receiver was removed :return: flag if receiver was removed
:rtype: bool :rtype: bool
""" """
removed = False
new_receiver_key = make_id(receiver) new_receiver_key = make_id(receiver)
for ind, rec in enumerate(self._receivers): receiver = self._receivers.pop(new_receiver_key, None)
rec_id, _ = rec return True if receiver is not None else False
if rec_id == new_receiver_key:
removed = True
del self._receivers[ind]
break
return removed
async def send(self, sender: Type["Model"], **kwargs: Any) -> None: async def send(self, sender: Type["Model"], **kwargs: Any) -> None:
""" """
@ -93,10 +87,10 @@ class Signal:
:param kwargs: arguments passed to receivers :param kwargs: arguments passed to receivers
:type kwargs: Any :type kwargs: Any
""" """
receivers = [] receivers = [
for receiver in self._receivers: receiver_func(sender=sender, **kwargs)
_, receiver_func = receiver for receiver_func in self._receivers.values()
receivers.append(receiver_func(sender=sender, **kwargs)) ]
await asyncio.gather(*receivers) await asyncio.gather(*receivers)