Armin Rigo added the comment: (B8) also discussed in connection with https://bugs.python.org/issue28427
weak dicts (both kinds) and weak sets have an implementation of __len__ which doesn't give the "expected" result on PyPy, and in some cases on CPython too. I'm not sure what is expected and what is not. Here is an example on CPython 3.5.2+ (using a thread to run the weakref callbacks only, not to explicitly inspect or modify 'd'):: import weakref, _thread from queue import Queue queue = Queue() def subthread(queue): while True: queue.get() _thread.start_new_thread(subthread, (queue,)) class X: pass d = weakref.WeakValueDictionary() while True: x = X() d[52] = x queue.put(x) del x while list(d) != []: pass assert len(d) == 0 # we've checked that list(d)==[], but this may fail On CPython I've seen the assert fail only after editing the function WeakValueDictionary.__init__.remove() to add ``time.sleep(0.01)`` as the first line. Otherwise I guess the timings happen to make that test pass. ---------- _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue28884> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com