From 22a60f8d0b331bf06c066ccba4eea5bb5e4ac9f2 Mon Sep 17 00:00:00 2001 From: Adam Chainz Date: Tue, 22 Nov 2016 14:30:14 +0000 Subject: [PATCH] Fixed #27513 -- Made Signal.send()/send_robust() a tiny bit faster. --- django/dispatch/dispatcher.py | 15 +++++++-------- django/test/signals.py | 6 +++--- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/django/dispatch/dispatcher.py b/django/dispatch/dispatcher.py index 8b26c39055..742acd198b 100644 --- a/django/dispatch/dispatcher.py +++ b/django/dispatch/dispatcher.py @@ -185,14 +185,13 @@ class Signal(object): Returns a list of tuple pairs [(receiver, response), ... ]. """ - responses = [] if not self.receivers or self.sender_receivers_cache.get(sender) is NO_RECEIVERS: - return responses + return [] - for receiver in self._live_receivers(sender): - response = receiver(signal=self, sender=sender, **named) - responses.append((receiver, response)) - return responses + return [ + (receiver, receiver(signal=self, sender=sender, **named)) + for receiver in self._live_receivers(sender) + ] def send_robust(self, sender, **named): """ @@ -218,12 +217,12 @@ class Signal(object): receiver. The traceback is always attached to the error at ``__traceback__``. """ - responses = [] if not self.receivers or self.sender_receivers_cache.get(sender) is NO_RECEIVERS: - return responses + return [] # Call each receiver with whatever arguments it can accept. # Return a list of tuple pairs [(receiver, response), ... ]. + responses = [] for receiver in self._live_receivers(sender): try: response = receiver(signal=self, sender=sender, **named) diff --git a/django/test/signals.py b/django/test/signals.py index 70b20625ff..98506609e1 100644 --- a/django/test/signals.py +++ b/django/test/signals.py @@ -8,7 +8,7 @@ from django.core.signals import setting_changed from django.db import connections, router from django.db.utils import ConnectionRouter from django.dispatch import Signal, receiver -from django.utils import timezone +from django.utils import six, timezone from django.utils.functional import empty template_rendered = Signal(providing_args=["template", "context"]) @@ -127,9 +127,9 @@ def file_storage_changed(**kwargs): def complex_setting_changed(**kwargs): if kwargs['enter'] and kwargs['setting'] in COMPLEX_OVERRIDE_SETTINGS: # Considering the current implementation of the signals framework, - # stacklevel=5 shows the line containing the override_settings call. + # this stacklevel shows the line containing the override_settings call. warnings.warn("Overriding setting %s can lead to unexpected behavior." - % kwargs['setting'], stacklevel=5) + % kwargs['setting'], stacklevel=5 if six.PY2 else 6) @receiver(setting_changed)