Added return value to Signal.disconnect().

This commit is contained in:
Andriy Sokolovskiy 2015-01-02 16:25:33 +02:00 committed by Tim Graham
parent 937fab030d
commit 23f1a8dad2
3 changed files with 21 additions and 3 deletions

View File

@ -160,14 +160,17 @@ class Signal(object):
else: else:
lookup_key = (_make_id(receiver), _make_id(sender)) lookup_key = (_make_id(receiver), _make_id(sender))
disconnected = False
with self.lock: with self.lock:
self._clear_dead_receivers() self._clear_dead_receivers()
for index in range(len(self.receivers)): for index in range(len(self.receivers)):
(r_key, _) = self.receivers[index] (r_key, _) = self.receivers[index]
if r_key == lookup_key: if r_key == lookup_key:
disconnected = True
del self.receivers[index] del self.receivers[index]
break break
self.sender_receivers_cache.clear() self.sender_receivers_cache.clear()
return disconnected
def has_listeners(self, sender=None): def has_listeners(self, sender=None):
return bool(self._live_receivers(sender)) return bool(self._live_receivers(sender))

View File

@ -278,7 +278,12 @@ Disconnecting signals
.. method:: Signal.disconnect([receiver=None, sender=None, weak=True, dispatch_uid=None]) .. method:: Signal.disconnect([receiver=None, sender=None, weak=True, dispatch_uid=None])
To disconnect a receiver from a signal, call :meth:`Signal.disconnect`. The To disconnect a receiver from a signal, call :meth:`Signal.disconnect`. The
arguments are as described in :meth:`.Signal.connect`. arguments are as described in :meth:`.Signal.connect`. The method returns
``True`` if a receiver was disconnected and ``False`` if not.
The *receiver* argument indicates the registered receiver to disconnect. It may The ``receiver`` argument indicates the registered receiver to disconnect. It
be ``None`` if ``dispatch_uid`` is used to identify the receiver. may be ``None`` if ``dispatch_uid`` is used to identify the receiver.
.. versionchanged:: 1.8
The boolean return value was added.

View File

@ -153,6 +153,16 @@ class DispatcherTests(unittest.TestCase):
a_signal.disconnect(receiver_3) a_signal.disconnect(receiver_3)
self.assertTestIsClean(a_signal) self.assertTestIsClean(a_signal)
def test_values_returned_by_disconnection(self):
receiver_1 = Callable()
receiver_2 = Callable()
a_signal.connect(receiver_1)
receiver_1_disconnected = a_signal.disconnect(receiver_1)
receiver_2_disconnected = a_signal.disconnect(receiver_2)
self.assertTrue(receiver_1_disconnected)
self.assertFalse(receiver_2_disconnected)
self.assertTestIsClean(a_signal)
def test_has_listeners(self): def test_has_listeners(self):
self.assertFalse(a_signal.has_listeners()) self.assertFalse(a_signal.has_listeners())
self.assertFalse(a_signal.has_listeners(sender=object())) self.assertFalse(a_signal.has_listeners(sender=object()))