@@ -171,7 +171,7 @@ class CallbackRegistry:
171
171
172
172
# We maintain two mappings:
173
173
# callbacks: signal -> {cid -> weakref-to-callback}
174
- # _func_cid_map: signal -> { weakref-to-callback -> cid}
174
+ # _func_cid_map: {( signal, weakref-to-callback) -> cid}
175
175
176
176
def __init__ (self , exception_handler = _exception_printer , * , signals = None ):
177
177
self ._signals = None if signals is None else list (signals ) # Copy it.
@@ -201,22 +201,20 @@ def __setstate__(self, state):
201
201
for cid , func in d .items ()}
202
202
for s , d in self .callbacks .items ()}
203
203
self ._func_cid_map = {
204
- s : { proxy : cid for cid , proxy in d . items ()}
205
- for s , d in self .callbacks .items ()}
204
+ ( s , proxy ) : cid
205
+ for s , d in self .callbacks .items () for cid , proxy in d . items () }
206
206
207
207
def connect (self , signal , func ):
208
208
"""Register *func* to be called when signal *signal* is generated."""
209
209
if self ._signals is not None :
210
210
_api .check_in_list (self ._signals , signal = signal )
211
- self ._func_cid_map .setdefault (signal , {})
212
211
proxy = _weak_or_strong_ref (func , functools .partial (self ._remove_proxy , signal ))
213
- if proxy in self ._func_cid_map [signal ]:
214
- return self ._func_cid_map [signal ][proxy ]
215
- cid = next (self ._cid_gen )
216
- self ._func_cid_map [signal ][proxy ] = cid
217
- self .callbacks .setdefault (signal , {})
218
- self .callbacks [signal ][cid ] = proxy
219
- return cid
212
+ try :
213
+ return self ._func_cid_map [signal , proxy ]
214
+ except KeyError :
215
+ cid = self ._func_cid_map [signal , proxy ] = next (self ._cid_gen )
216
+ self .callbacks .setdefault (signal , {})[cid ] = proxy
217
+ return cid
220
218
221
219
def _connect_picklable (self , signal , func ):
222
220
"""
@@ -234,16 +232,14 @@ def _remove_proxy(self, signal, proxy, *, _is_finalizing=sys.is_finalizing):
234
232
if _is_finalizing ():
235
233
# Weakrefs can't be properly torn down at that point anymore.
236
234
return
237
- cid = self ._func_cid_map [ signal ] .pop (proxy , None )
235
+ cid = self ._func_cid_map .pop (( signal , proxy ) , None )
238
236
if cid is not None :
239
237
del self .callbacks [signal ][cid ]
240
238
self ._pickled_cids .discard (cid )
241
239
else : # Not found
242
240
return
243
- # Clean up empty dicts
244
- if len (self .callbacks [signal ]) == 0 :
241
+ if len (self .callbacks [signal ]) == 0 : # Clean up empty dicts
245
242
del self .callbacks [signal ]
246
- del self ._func_cid_map [signal ]
247
243
248
244
def disconnect (self , cid ):
249
245
"""
@@ -252,22 +248,16 @@ def disconnect(self, cid):
252
248
No error is raised if such a callback does not exist.
253
249
"""
254
250
self ._pickled_cids .discard (cid )
255
- # Clean up callbacks
256
- for signal , cid_to_proxy in list (self .callbacks .items ()):
257
- proxy = cid_to_proxy .pop (cid , None )
258
- if proxy is not None :
251
+ for signal , proxy in self ._func_cid_map :
252
+ if self ._func_cid_map [signal , proxy ] == cid :
259
253
break
260
254
else : # Not found
261
255
return
262
- proxy_to_cid = self ._func_cid_map [signal ]
263
- for current_proxy , current_cid in list (proxy_to_cid .items ()):
264
- if current_cid == cid :
265
- assert proxy is current_proxy
266
- del proxy_to_cid [current_proxy ]
267
- # Clean up empty dicts
268
- if len (self .callbacks [signal ]) == 0 :
256
+ assert self .callbacks [signal ][cid ] == proxy
257
+ del self .callbacks [signal ][cid ]
258
+ del self ._func_cid_map [signal , proxy ]
259
+ if len (self .callbacks [signal ]) == 0 : # Clean up empty dicts
269
260
del self .callbacks [signal ]
270
- del self ._func_cid_map [signal ]
271
261
272
262
def process (self , s , * args , ** kwargs ):
273
263
"""
0 commit comments