I would also like to point out that I submitted a patch related to that a couple of months ago in:

http://bugs.python.org/issue839159

But it never got any attention :( I'm not sure if it is still relevant.

Virgil




On 13-Sep-08, at 10:20 PM, Armin Ronacher wrote:

Hi everybody,

In Python 2.x when iterating over a weak key dictionary for example, the common idom for doing that was calling dictionary.keys() to ensure that a list of all objects is returned it was safe to iterate over as a weak reference could stop existing during dict iteration which of course raises a runtime error by the
dict iterator.

This was documented behavior and worked pretty well, with the small problem that suddenly all references in the dict wouldn't die until iteration is over because
the list holds references to the object.

This no longer works in Python 3 because .keys() on the weak key dictionary returns a generator over the key view of the internal dict which of course has
the same problem as iterkeys in Python 2.x.

The following code shows the problem::

   from weakref import WeakKeyDictionary

   f1 = Foo()
   f2 = Foo()
   d = WeakKeyDictionary()
   d[f1] = 42
   d[f2] = 23

i = iter(d.keys()) # or use d.keyrefs() here which has the same problem
   print(next(i))
   del f2
   print(next(i))

This example essentially dies with "RuntimeError: dictionary changed
size during iteration" as soon as f2 is deleted.

Iterating over weak key dictionaries might not be the most common task but I know some situations where this is necessary. Unfortunately I can't see a
way to achieve that in Python 3.

Regards,
Armin

_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/hsoft%40hardcoded.net

_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to