From 873d165eb0a12445f06747fedb30cafd0d531e06 Mon Sep 17 00:00:00 2001 From: jason kirtland Date: Tue, 29 Aug 2017 09:33:08 -0700 Subject: Fix: Lower baseline cost of no-op signal send() & optional -O speedup --- blinker/base.py | 15 ++++++++++----- 1 file 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*. -- cgit v1.2.1