Commit 23f1a8da authored by Andriy Sokolovskiy's avatar Andriy Sokolovskiy Committed by Tim Graham
Browse files

Added return value to Signal.disconnect().

parent 937fab03
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -160,14 +160,17 @@ class Signal(object):
        else:
            lookup_key = (_make_id(receiver), _make_id(sender))

        disconnected = False
        with self.lock:
            self._clear_dead_receivers()
            for index in range(len(self.receivers)):
                (r_key, _) = self.receivers[index]
                if r_key == lookup_key:
                    disconnected = True
                    del self.receivers[index]
                    break
            self.sender_receivers_cache.clear()
        return disconnected

    def has_listeners(self, sender=None):
        return bool(self._live_receivers(sender))
+8 −3
Original line number Diff line number Diff line
@@ -278,7 +278,12 @@ Disconnecting signals
.. method:: Signal.disconnect([receiver=None, sender=None, weak=True, dispatch_uid=None])

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
be ``None`` if ``dispatch_uid`` is used to identify the receiver.
The ``receiver`` argument indicates the registered receiver to disconnect. It
may be ``None`` if ``dispatch_uid`` is used to identify the receiver.

.. versionchanged:: 1.8

    The boolean return value was added.
+10 −0
Original line number Diff line number Diff line
@@ -153,6 +153,16 @@ class DispatcherTests(unittest.TestCase):
        a_signal.disconnect(receiver_3)
        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):
        self.assertFalse(a_signal.has_listeners())
        self.assertFalse(a_signal.has_listeners(sender=object()))