Prevent dictionary size from changing while iterating over its items

In Python 3, dict.items() returns 'a dict_item'. Iterating over it while
deleting some of the dictionary elements is forbidden. We have to iterate over
a list to avoid getting this error:

    RuntimeError: dictionary changed size during iteration

Change-Id: I43401e6eb9a31148fda4677644bf99e1b739d0dd
This commit is contained in:
Cyril Roelandt
2013-12-16 11:39:59 +01:00
parent 6cd7b4b26e
commit 4d05acad99

View File

@@ -51,23 +51,21 @@ def getid(obj):
def filter_kwargs(f): def filter_kwargs(f):
@functools.wraps(f) @functools.wraps(f)
def func(*args, **kwargs): def func(*args, **kwargs):
for key, ref in kwargs.items(): new_kwargs = {}
for key, ref in six.iteritems(kwargs):
if ref is None: if ref is None:
# drop null values # drop null values
del kwargs[key]
continue continue
id_value = getid(ref) id_value = getid(ref)
if id_value == ref: if id_value != ref:
continue # If an object with an id was passed, then use the id, e.g:
# user: user(id=1) becomes user_id: 1
key = '%s_id' % key
# if an object with an id was passed remove the object new_kwargs[key] = id_value
# from params and replace it with just the id.
# e.g user: User(id=1) becomes user_id: 1
del kwargs[key]
kwargs['%s_id' % key] = id_value
return f(*args, **kwargs) return f(*args, **new_kwargs)
return func return func