Show More
@@ -0,0 +1,7 b'' | |||
|
1 | Update IPython event triggering to ensure callback registration and | |
|
2 | unregistration only affects the set of callbacks the *next* time that event is | |
|
3 | triggered. See :ghissue:`9447` and :ghpull:`9453`. | |
|
4 | ||
|
5 | This is a change to the existing semantics, wherein one callback registering a | |
|
6 | second callback when triggered for an event would previously be invoked for | |
|
7 | that same event. |
@@ -69,7 +69,7 b' class EventManager(object):' | |||
|
69 | 69 | Any additional arguments are passed to all callbacks registered for this |
|
70 | 70 | event. Exceptions raised by callbacks are caught, and a message printed. |
|
71 | 71 | """ |
|
72 | for func in self.callbacks[event]: | |
|
72 | for func in self.callbacks[event][:]: | |
|
73 | 73 | try: |
|
74 | 74 | func(*args, **kwargs) |
|
75 | 75 | except Exception: |
@@ -30,3 +30,25 b' class CallbackTests(unittest.TestCase):' | |||
|
30 | 30 | self.em.register('ping_received', cb) |
|
31 | 31 | with tt.AssertPrints("Error in callback"): |
|
32 | 32 | self.em.trigger('ping_received') |
|
33 | ||
|
34 | def test_unregister_during_callback(self): | |
|
35 | invoked = [False] * 3 | |
|
36 | ||
|
37 | def func1(*_): | |
|
38 | invoked[0] = True | |
|
39 | self.em.unregister('ping_received', func1) | |
|
40 | self.em.register('ping_received', func3) | |
|
41 | ||
|
42 | def func2(*_): | |
|
43 | invoked[1] = True | |
|
44 | self.em.unregister('ping_received', func2) | |
|
45 | ||
|
46 | def func3(*_): | |
|
47 | invoked[2] = True | |
|
48 | ||
|
49 | self.em.register('ping_received', func1) | |
|
50 | self.em.register('ping_received', func2) | |
|
51 | ||
|
52 | self.em.trigger('ping_received') | |
|
53 | self.assertEqual([True, True, False], invoked) | |
|
54 | self.assertEqual([func3], self.em.callbacks['ping_received']) |
General Comments 0
You need to be logged in to leave comments.
Login now