Source code for experimentor.core.signal
from experimentor.lib.log import get_logger
logger = get_logger(__name__)
[docs]class Signal:
""" Base signal which implements the common pattern for defining, emitting and connecting a signal
"""
def __init__(self):
self.name = None
def __set_name__(self, owner, name):
model_signals = getattr(owner, '_signals')
if getattr(model_signals, 'model_name', None) != object.__qualname__:
model_signals = model_signals.__class__(*model_signals)
setattr(model_signals, 'model_name', object.__qualname__)
setattr(owner, '_signals', model_signals)
model_signals[name] = self
self.name = name
self.owner = str(owner)
def __get__(self, instance, owner):
self.instance = instance
return self
[docs] def emit(self, payload=None, **kwargs):
""" Emitting a signal relies on the owner's publisher or whatever method the owner specifies for broadcasting.
In principle this allows for some flexibility in case owners use different ways of broadcasting information.
For example, the owner could be a QObject and it could use the internals of Qt to emitting signals.
"""
logger.debug(f'Emitting {self.name} from {self.owner}')
self.instance.emit(self.name, payload, **kwargs)
@property
def url(self):
return f"{self.instance.get_publisher_url()}:{self.instance.get_publisher_port()}"
def __str__(self):
return f"Signal {self.name} from {self.owner}"
def __repr__(self):
return f"Signal {self.name} from {self.owner}"