我们从Python开源项目中,提取了以下44个代码示例,用于说明如何使用weakref.ReferenceType()。
def list_pubs(): # import pdb; pdb.set_trace() import weakref msg = [] for receiver in signals.post_save.receivers: (receiver_class_name,_), receiver = receiver # django.contrib.contenttypes.generic.GenericForeignKey.instance_pre_init is not weakref if isinstance(receiver, weakref.ReferenceType): receiver = receiver() receiver = getattr(receiver, '__wraps__', receiver) receiver_name = getattr(receiver, '__name__', str(receiver)) text = "%s.%s" % (receiver_class_name, receiver_name) if receiver_name == 'publish_rdf' : msg.append(text) return str(msg)
def emit(self, *args, **kwargs): ''' Emit the event with the given positional and keyword arguments. Returns a dict mapping event listeners to their results, or an exception instance if calling the listener raised one. ''' results = {} # kwargs['__event__'] = self for listener in self._listeners.values(): if isinstance(listener, (weakref.ReferenceType, BoundMethodWeakref)): listener = listener() if listener is None: # This shouldn't happen, but we need to guard for it. continue try: results[listener] = listener(*args, **kwargs) except Exception as e: if self._abort_on_error: raise results[listener] = e print("error in listener: %s".format(listener)) import traceback traceback.print_exc() return results
def _clear_dead_receivers(self): if self._dead_receivers: self._dead_receivers = False new_receivers = [] for rec in self.receivers: if isinstance(rec[1], weakref.ReferenceType) and rec[1]() is None: continue new_receivers.append(rec) self.receivers = new_receivers
def _clear_dead_receivers(self): # Note: caller is assumed to hold self.lock. if self._dead_receivers: self._dead_receivers = False new_receivers = [] for r in self.receivers: if isinstance(r[1], weakref.ReferenceType) and r[1]() is None: continue new_receivers.append(r) self.receivers = new_receivers
def _live_receivers(self, sender): """ Filter sequence of receivers to get resolved, live receivers. This checks for weak references and resolves them, then returning only live receivers. """ receivers = None if self.use_caching and not self._dead_receivers: receivers = self.sender_receivers_cache.get(sender) # We could end up here with NO_RECEIVERS even if we do check this case in # .send() prior to calling _live_receivers() due to concurrent .send() call. if receivers is NO_RECEIVERS: return [] if receivers is None: with self.lock: self._clear_dead_receivers() senderkey = _make_id(sender) receivers = [] for (receiverkey, r_senderkey), receiver in self.receivers: if r_senderkey == NONE_ID or r_senderkey == senderkey: receivers.append(receiver) if self.use_caching: if not receivers: self.sender_receivers_cache[sender] = NO_RECEIVERS else: # Note, we must cache the weakref versions. self.sender_receivers_cache[sender] = receivers non_weak_receivers = [] for receiver in receivers: if isinstance(receiver, weakref.ReferenceType): # Dereference the weak reference. receiver = receiver() if receiver is not None: non_weak_receivers.append(receiver) else: non_weak_receivers.append(receiver) return non_weak_receivers
def __init__(self, sw): '''Constructor, May be extended, do not override. sw -- soapWriter instance ''' self.sw = None if not isinstance(sw, weakref.ReferenceType) and sw is not None: self.sw = weakref.ref(sw) else: self.sw = sw
def __init__(self, sw): '''Constructor, May be extended, do not override. sw -- soapWriter instance ''' self.sw = None if type(sw) != weakref.ReferenceType and sw is not None: self.sw = weakref.ref(sw) else: self.sw = sw
def removeListener(self, listener, exclude='dummy'): """ Remove a listener object or callback. :listener: can be object, weakref, sequence or '*' """ if listener == '*': self.warning('Removing all listeners') listener = [k for k in self.listeners.keys() if not k().name==exclude] elif isString(listener): listener = [k for k in self.listeners.keys() if k().name==listener] if isSequence(listener): while listener: self.removeListener(listener.pop()) return elif not isinstance(listener,weakref.ReferenceType): listener = weakref.ref(listener,self._listenerDied) try: self.listeners.pop(listener) except Exception, e: return False if not self.listeners: self.unsubscribeEvents() return True
def reconnect_signals(self): """ Reconnect the signals """ for signal, receivers in self.signal_map.items(): for sender_id, receiver in receivers: lookup_key, receiver_method = receiver if isinstance(receiver_method, weakref.ReferenceType): receiver_method = receiver_method() signal.connect( receiver_method, sender=self.senders[sender_id], dispatch_uid=lookup_key[0])
def test_alive(self): o = Object(1) r = weakref.WeakMethod(o.some_method) self.assertIsInstance(r, weakref.ReferenceType) self.assertIsInstance(r(), type(o.some_method)) self.assertIs(r().__self__, o) self.assertIs(r().__func__, o.some_method.__func__) self.assertEqual(r()(), 4)
def _call_callback(self, callback, user_arg, user_args, emit_args): if user_args: args_to_pass = [] for arg in user_args: if isinstance(arg, weakref.ReferenceType): arg = arg() if arg is None: # If the weakref is None, the referenced object # was cleaned up. We just skip the entire # callback in this case. The weakref cleanup # handler will have removed the callback when # this happens, so no need to actually remove # the callback here. return False args_to_pass.append(arg) args_to_pass.extend(emit_args) else: # Optimization: Don't create a new list when there are # no user_args args_to_pass = emit_args # The deprecated user_arg argument was added to the end # instead of the beginning. if user_arg is not None: args_to_pass = itertools.chain(args_to_pass, (user_arg,)) return bool(callback(*args_to_pass))
def parent(self): """The object's parent""" if isinstance(self._parent, weakref.ReferenceType): return self._parent() else: return self._parent
def send(self, source, raw=False, catch_exceptions=False, gather=True): """ Send signal with source. If any receiver raises an error, the error propagates back through send, terminating the dispatch loop. So it's possible that all receivers won't be called if an error is raised. :param source: The data to be send to the processor which produces data that will be send to the receivers. :param raw: Optional bool parameter to just send the source to the receivers without any processing. :param catch_exceptions: Catch and return the exceptions. :param gather: Execute multiple receivers at the same time (parallel). On by default! :return: Return a list of tuple pairs [(receiver, response), ... ]. """ if raw is False: try: kwargs = await self.process_target(signal=self, source=source) except SignalGlueStop: # Stop calling the receivers when our glue says we should! return [] else: kwargs = dict(**source, signal=self) if not self.receivers: return [] # Prepare the responses from the calls. responses = [] gather_list = [] for key, receiver in self._live_receivers(): # Dereference the weak reference. slf = self.self_refs.get(key, None) if slf and isinstance(slf, weakref.ReferenceType): slf = slf() args = [slf] if slf else [] # Execute the receiver. coro = self.execute_receiver(receiver, args, kwargs, ignore_exceptions=catch_exceptions) if gather: gather_list.append(coro) else: responses.append(await coro) # If gather, wait on the asyncio.gather operation and return the responses from there. if gather: return await asyncio.gather(*gather_list) # Done, respond with all the results return responses
def _live_receivers(self): """ Filter sequence of receivers to get resolved, live receivers. This checks for weak references and resolves them, then returning only live receivers. """ # We don't use the sender. Set it to none. sender = None receivers = None if self.use_caching and not self._dead_receivers: receivers = self.sender_receivers_cache.get(sender) # We could end up here with NO_RECEIVERS even if we do check this case in # .send() prior to calling _live_receivers() due to concurrent .send() call. if receivers is NO_RECEIVERS: return [] if receivers is None: with self.lock: self._clear_dead_receivers() receivers = [] for receiverkey, receiver in self.receivers: receivers.append((receiverkey, receiver)) if self.use_caching: if not receivers: self.sender_receivers_cache[sender] = NO_RECEIVERS else: # Note, we must cache the weakref versions. self.sender_receivers_cache[sender] = receivers non_weak_receivers = [] for receiver in receivers: key = receiver[0] receiver = receiver[1] if isinstance(receiver, weakref.ReferenceType): # Dereference the weak reference. receiver = receiver() if receiver is not None: non_weak_receivers.append((key, receiver)) else: non_weak_receivers.append((key, receiver)) return non_weak_receivers
def objgrep(start, goal, eq=isLike, path='', paths=None, seen=None, showUnknowns=0, maxDepth=None): '''An insanely CPU-intensive process for finding stuff. ''' if paths is None: paths = [] if seen is None: seen = {} if eq(start, goal): paths.append(path) if seen.has_key(id(start)): if seen[id(start)] is start: return if maxDepth is not None: if maxDepth == 0: return maxDepth -= 1 seen[id(start)] = start if isinstance(start, types.DictionaryType): r = [] for k, v in start.items(): objgrep(k, goal, eq, path+'{'+repr(v)+'}', paths, seen, showUnknowns, maxDepth) objgrep(v, goal, eq, path+'['+repr(k)+']', paths, seen, showUnknowns, maxDepth) elif isinstance(start, types.ListType) or isinstance(start, types.TupleType): for idx in xrange(len(start)): objgrep(start[idx], goal, eq, path+'['+str(idx)+']', paths, seen, showUnknowns, maxDepth) elif isinstance(start, types.MethodType): objgrep(start.im_self, goal, eq, path+'.im_self', paths, seen, showUnknowns, maxDepth) objgrep(start.im_func, goal, eq, path+'.im_func', paths, seen, showUnknowns, maxDepth) objgrep(start.im_class, goal, eq, path+'.im_class', paths, seen, showUnknowns, maxDepth) elif hasattr(start, '__dict__'): for k, v in start.__dict__.items(): objgrep(v, goal, eq, path+'.'+k, paths, seen, showUnknowns, maxDepth) if isinstance(start, types.InstanceType): objgrep(start.__class__, goal, eq, path+'.__class__', paths, seen, showUnknowns, maxDepth) elif isinstance(start, weakref.ReferenceType): objgrep(start(), goal, eq, path+'()', paths, seen, showUnknowns, maxDepth) elif (isinstance(start, types.StringTypes+ (types.IntType, types.FunctionType, types.BuiltinMethodType, RegexType, types.FloatType, types.NoneType, types.FileType)) or type(start).__name__ in ('wrapper_descriptor', 'method_descriptor', 'member_descriptor', 'getset_descriptor')): pass elif showUnknowns: print 'unknown type', type(start), start return paths
def enqueue_coro(self, coro, priority=1): def future_wrapper(coro, future): @functools.wraps(coro) async def inner(): try: res = await coro except Exception as e: future.set_exception(e) else: future.set_result(res) finally: self._process_next.set() return inner def task_cb(future): if isinstance(self._external_cb, weakref.ReferenceType): external_cb = self._external_cb() else: external_cb = self._external_cb try: res = future.result() if self.results_queue.full(): self.results_queue.get_nowait() asyncio.ensure_future(self.results_queue.put(res), loop=self.loop) if external_cb: external_cb(res, None) except Exception as e: if external_cb: external_cb(None, exc=e) else: raise e f = asyncio.Future() f.add_done_callback(task_cb) coro_locals = {key: repr(val) for key, val in coro.cr_frame.f_locals.items()} self.tasks_queue.put_nowait(self.Task(future_wrapper(coro, f), priority, coro_locals, clock()))
def objgrep(start, goal, eq=isLike, path='', paths=None, seen=None, showUnknowns=0, maxDepth=None): """ An insanely CPU-intensive process for finding stuff. """ if paths is None: paths = [] if seen is None: seen = {} if eq(start, goal): paths.append(path) if id(start) in seen: if seen[id(start)] is start: return if maxDepth is not None: if maxDepth == 0: return maxDepth -= 1 seen[id(start)] = start # Make an alias for those arguments which are passed recursively to # objgrep for container objects. args = (paths, seen, showUnknowns, maxDepth) if isinstance(start, dict): for k, v in start.items(): objgrep(k, goal, eq, path+'{'+repr(v)+'}', *args) objgrep(v, goal, eq, path+'['+repr(k)+']', *args) elif isinstance(start, (list, tuple, deque)): for idx, _elem in enumerate(start): objgrep(start[idx], goal, eq, path+'['+str(idx)+']', *args) elif isinstance(start, types.MethodType): objgrep(start.__self__, goal, eq, path+'.__self__', *args) objgrep(start.__func__, goal, eq, path+'.__func__', *args) objgrep(start.__self__.__class__, goal, eq, path+'.__self__.__class__', *args) elif hasattr(start, '__dict__'): for k, v in start.__dict__.items(): objgrep(v, goal, eq, path+'.'+k, *args) if isinstance(start, compat.InstanceType): objgrep(start.__class__, goal, eq, path+'.__class__', *args) elif isinstance(start, weakref.ReferenceType): objgrep(start(), goal, eq, path+'()', *args) elif (isinstance(start, (compat.StringType, int, types.FunctionType, types.BuiltinMethodType, RegexType, float, type(None), compat.FileType)) or type(start).__name__ in ('wrapper_descriptor', 'method_descriptor', 'member_descriptor', 'getset_descriptor')): pass elif showUnknowns: print('unknown type', type(start), start) return paths