Source code for cosapp.core.signal.slot
"""
Module defining the Slot class.
"""
import types
from typing import Any, Callable, Optional
import weakref
[docs]
class Slot:
"""
A slot is a callable object that manages a connection to a signal.
If weak is true or the slot is a subclass of weakref.ref, the slot
is automatically de-referenced to the called function.
"""
__slots__ = ["__weak", "__slot"]
def __init__(self, slot: Callable, weak: bool=True):
if not callable(slot):
raise TypeError("A `Slot` instance must be defined from a callable object.")
self.__weak = bool(weak) or isinstance(slot, weakref.ref)
if weak and not isinstance(slot, weakref.ref):
if isinstance(slot, types.MethodType):
slot = weakref.WeakMethod(slot)
else:
slot = weakref.ref(slot)
self.__slot = slot
@property
def is_alive(self) -> bool:
"""
Return `True` if slot is alive, `False` otherwise.
"""
return (not self.__weak) or (self.__slot() is not None)
@property
def func(self) -> Callable:
"""
Return the function called by slot.
"""
return self.__slot() if self.__weak else self.__slot
def __call__(self, **kwargs) -> Optional[Any]:
"""
Execute slot.
"""
func = self.func
if func is not None:
return func(**kwargs)
def __eq__(self, other) -> bool:
"""
Compare this slot to another.
"""
if isinstance(other, Slot):
return self.func == other.func
else:
return self.func == other
def __repr__(self) -> str:
f = self.func
s = "dead" if f is None else repr(f)
return f"<cosapp.core.signal.Slot: {s}>"