summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjason kirtland <jek@discorporate.us>2017-08-29 09:33:08 -0700
committerjason kirtland <jek@discorporate.us>2017-08-29 10:06:09 -0700
commit873d165eb0a12445f06747fedb30cafd0d531e06 (patch)
tree6c0c945ab7d7de3de623a634315826a1b676be96
parent638cbae12f60965053f53b61191d2541fbf605b8 (diff)
downloadblinker-faster-noop-send.tar.gz
Fix: Lower baseline cost of no-op signal send() & optional -O speedupfaster-noop-send
-rw-r--r--blinker/base.py15
1 files changed, 10 insertions, 5 deletions
diff --git a/blinker/base.py b/blinker/base.py
index cc5880e..3fd77d8 100644
--- a/blinker/base.py
+++ b/blinker/base.py
@@ -250,6 +250,14 @@ class Signal(object):
:param \*\*kwargs: Data to be sent to receivers.
"""
+ if not self.receivers:
+ # Ensure correct signature even on no-op sends, disable with -O
+ # for lowest possible cost.
+ if __debug__ and sender and len(sender) > 1:
+ raise TypeError('send() accepts only one positional '
+ 'argument, %s given' % len(sender))
+ return []
+
# Using '*sender' rather than 'sender=None' allows 'sender' to be
# used as a keyword argument- i.e. it's an invisible name in the
# function signature.
@@ -260,11 +268,8 @@ class Signal(object):
'%s given' % len(sender))
else:
sender = sender[0]
- if not self.receivers:
- return []
- else:
- return [(receiver, receiver(sender, **kwargs))
- for receiver in self.receivers_for(sender)]
+ return [(receiver, receiver(sender, **kwargs))
+ for receiver in self.receivers_for(sender)]
def has_receivers_for(self, sender):
"""True if there is probably a receiver for *sender*.