def send(signal=All, sender=Anonymous, *arguments, **named): """Send ``signal`` from ``sender`` to all connected receivers. - ``signal``: (Hashable) signal value; see ``connect`` for details. - ``sender``: The sender of the signal. If ``Any``, only receivers registered for ``Any`` will receive the message. If ``Anonymous``, only receivers registered to receive messages from ``Anonymous`` or ``Any`` will receive the message. Otherwise can be any Python object (normally one registered with a connect if you actually want something to occur). - ``arguments``: Positional arguments which will be passed to *all* receivers. Note that this may raise ``TypeError`` if the receivers do not allow the particular arguments. Note also that arguments are applied before named arguments, so they should be used with care. - ``named``: Named arguments which will be filtered according to the parameters of the receivers to only provide those acceptable to the receiver. Return a list of tuple pairs ``[(receiver, response), ...]`` If any receiver raises an error, the error propagates back through send, terminating the dispatch loop, so it is quite possible to not have all receivers called if a raises an error. """ # Call each receiver with whatever arguments it can accept. # Return a list of tuple pairs [(receiver, response), ... ]. responses = [] for receiver in live_receivers(get_all_receivers(sender, signal)): # Wrap receiver using installed plugins. original = receiver for plugin in plugins: receiver = plugin.wrap_receiver(receiver) response = robustapply.robust_apply( receiver, original, signal=signal, sender=sender, *arguments, **named ) responses.append((receiver, response)) # Update stats. if __debug__: global sends sends += 1 return responses
def send_robust(signal=All, sender=Anonymous, *arguments, **named): """Send ``signal`` from ``sender`` to all connected receivers catching errors - ``signal``: (Hashable) signal value, see connect for details - ``sender``: The sender of the signal. If ``Any``, only receivers registered for ``Any`` will receive the message. If ``Anonymous``, only receivers registered to receive messages from ``Anonymous`` or ``Any`` will receive the message. Otherwise can be any Python object (normally one registered with a connect if you actually want something to occur). - ``arguments``: Positional arguments which will be passed to *all* receivers. Note that this may raise ``TypeError`` if the receivers do not allow the particular arguments. Note also that arguments are applied before named arguments, so they should be used with care. - ``named``: Named arguments which will be filtered according to the parameters of the receivers to only provide those acceptable to the receiver. Return a list of tuple pairs ``[(receiver, response), ... ]`` If any receiver raises an error (specifically, any subclass of ``Exception``), the error instance is returned as the result for that receiver. """ # Call each receiver with whatever arguments it can accept. # Return a list of tuple pairs [(receiver, response), ... ]. responses = [] for receiver in live_receivers(get_all_receivers(sender, signal)): original = receiver for plugin in plugins: receiver = plugin.wrap_receiver(receiver) try: response = robustapply.robust_apply( receiver, original, signal=signal, sender=sender, *arguments, **named ) except Exception, err: responses.append((receiver, err)) else: responses.append((receiver, response))
def send(signal=All, sender=Anonymous, *arguments, **named): """Send ``signal`` from ``sender`` to all connected receivers. - ``signal``: (Hashable) signal value; see ``connect`` for details. - ``sender``: The sender of the signal. If ``Any``, only receivers registered for ``Any`` will receive the message. If ``Anonymous``, only receivers registered to receive messages from ``Anonymous`` or ``Any`` will receive the message. Otherwise can be any Python object (normally one registered with a connect if you actually want something to occur). - ``arguments``: Positional arguments which will be passed to *all* receivers. Note that this may raise ``TypeError`` if the receivers do not allow the particular arguments. Note also that arguments are applied before named arguments, so they should be used with care. - ``named``: Named arguments which will be filtered according to the parameters of the receivers to only provide those acceptable to the receiver. Return a list of tuple pairs ``[(receiver, response), ...]`` If any receiver raises an error, the error propagates back through send, terminating the dispatch loop, so it is quite possible to not have all receivers called if a raises an error. """ # Call each receiver with whatever arguments it can accept. # Return a list of tuple pairs [(receiver, response), ... ]. responses = [] for receiver in live_receivers(get_all_receivers(sender, signal)): # Wrap receiver using installed plugins. original = receiver for plugin in plugins: receiver = plugin.wrap_receiver(receiver) response = robustapply.robust_apply(receiver, original, signal=signal, sender=sender, *arguments, **named) responses.append((receiver, response)) # Update stats. if __debug__: global sends sends += 1 return responses
def send_robust(signal=All, sender=Anonymous, *arguments, **named): """Send ``signal`` from ``sender`` to all connected receivers catching errors - ``signal``: (Hashable) signal value, see connect for details - ``sender``: The sender of the signal. If ``Any``, only receivers registered for ``Any`` will receive the message. If ``Anonymous``, only receivers registered to receive messages from ``Anonymous`` or ``Any`` will receive the message. Otherwise can be any Python object (normally one registered with a connect if you actually want something to occur). - ``arguments``: Positional arguments which will be passed to *all* receivers. Note that this may raise ``TypeError`` if the receivers do not allow the particular arguments. Note also that arguments are applied before named arguments, so they should be used with care. - ``named``: Named arguments which will be filtered according to the parameters of the receivers to only provide those acceptable to the receiver. Return a list of tuple pairs ``[(receiver, response), ... ]`` If any receiver raises an error (specifically, any subclass of ``Exception``), the error instance is returned as the result for that receiver. """ # Call each receiver with whatever arguments it can accept. # Return a list of tuple pairs [(receiver, response), ... ]. responses = [] for receiver in live_receivers(get_all_receivers(sender, signal)): original = receiver for plugin in plugins: receiver = plugin.wrap_receiver(receiver) try: response = robustapply.robust_apply(receiver, original, signal=signal, sender=sender, *arguments, **named) except Exception, err: responses.append((receiver, err)) else: responses.append((receiver, response))
def send_minimal(signal=All, sender=Anonymous, *arguments, **named): """Like ``send``, but does not attach ``signal`` and ``sender`` arguments to the call to the receiver.""" # Call each receiver with whatever arguments it can accept. # Return a list of tuple pairs [(receiver, response), ... ]. responses = [] for receiver in live_receivers(get_all_receivers(sender, signal)): # Wrap receiver using installed plugins. original = receiver for plugin in plugins: receiver = plugin.wrap_receiver(receiver) response = robustapply.robust_apply(receiver, original, *arguments, **named) responses.append((receiver, response)) # Update stats. if __debug__: global sends sends += 1 return responses
def send_exact(signal=All, sender=Anonymous, *arguments, **named): """Send ``signal`` only to receivers registered for exact message. ``send_exact`` allows for avoiding ``Any``/``Anonymous`` registered handlers, sending only to those receivers explicitly registered for a particular signal on a particular sender. """ responses = [] for receiver in live_receivers(get_receivers(sender, signal)): # Wrap receiver using installed plugins. original = receiver for plugin in plugins: receiver = plugin.wrap_receiver(receiver) response = robustapply.robust_apply(receiver, original, signal=signal, sender=sender, *arguments, **named) responses.append((receiver, response)) return responses
def send_exact(signal=All, sender=Anonymous, *arguments, **named): """Send ``signal`` only to receivers registered for exact message. ``send_exact`` allows for avoiding ``Any``/``Anonymous`` registered handlers, sending only to those receivers explicitly registered for a particular signal on a particular sender. """ responses = [] for receiver in live_receivers(get_receivers(sender, signal)): # Wrap receiver using installed plugins. original = receiver for plugin in plugins: receiver = plugin.wrap_receiver(receiver) response = robustapply.robust_apply( receiver, original, signal=signal, sender=sender, *arguments, **named ) responses.append((receiver, response)) return responses
def send_minimal(signal=All, sender=Anonymous, *arguments, **named): """Like ``send``, but does not attach ``signal`` and ``sender`` arguments to the call to the receiver.""" # Call each receiver with whatever arguments it can accept. # Return a list of tuple pairs [(receiver, response), ... ]. responses = [] for receiver in live_receivers(get_all_receivers(sender, signal)): # Wrap receiver using installed plugins. original = receiver for plugin in plugins: receiver = plugin.wrap_receiver(receiver) response = robustapply.robust_apply( receiver, original, *arguments, **named ) responses.append((receiver, response)) # Update stats. if __debug__: global sends sends += 1 return responses