On 4/20/2011 5:52 AM, Laszlo Nagy wrote:
Given this iterator:
class SomeIterableObject(object):
....
....
def __iter__(self):
ukeys = self.updates.keys()
for key in ukeys:
if self.updates.has_key(key):
yield self.updates[key]
for rec in self.inserts:
yield rec
....
....
How can I get this exception:
RuntimeError: dictionary changed size during iteration
It is true that self.updates is being changed during the iteration. But
I have created the "ukeys" variable solely to prevent this kind of
error. Here is a proof of correctness:
I think we need to see some more code here.
Also, what version of Python are you running?
http://docs.python.org/library/stdtypes.html
says "keys()
Return a copy of the dictionary’s list of keys."
So "ukeys" should be a unique list, not some part of
self.updates or a generator.
At least in Python 2.6, keys() does return a unique list. Each
call to "keys()" returns a new list object unconnected to the
dictionary from which the keys were extracted. But someone may
have decided in a later version to return a generator, as
an optimization. Did that happen?
John Nagle
--
http://mail.python.org/mailman/listinfo/python-list