Python RuntimerError, RuntimeError ('diccionario cambió de tamaño durante la iteración')
Cuando intento insertar una clave o un valor en un dictado, este código generará un error de ejecución ('diccionario cambió de tamaño durante la iteración')
Aquí está mi código:
#1. Delcare the Dict val here
dict_plugin_info = {}
#2. For module.__dict__...
for name, attr in module.__dict__.items():
if ((inspect.isclass(attr) and (name.startswith("_") or
attr.__dict__.get("__module__") != module_id))):
continue
if inspect.isclass(attr) and issubclass(attr, PluginInterfaceBase):
inst = attr()
# the follow
plugin_type = inst.plugin_type
keys = list(dict_plugin_info.keys())
if plugin_type not in keys:
###HERE RuntimeError('dictionary changed size during iteration')####
dict_plugin_info[plugin_type] = attr
else:
raise MultiplePluginError("Multiple plugins Type {} Name:{}".format(
plugin_type,
attr.__class__.__name__))
No sé cómo sucedió esto. Busco en el sitio web Most Ansower cuando el iterador dict y la tecla de eliminación generarán la excepción. Pero mi código no es eliminar la clave.
No estoy seguro de si module.__dict__
es una referencia a la variable dict_plugin_info
.
Si es así, en la línea dict_plugin_info[plugin_type] = attr
, está intentando insertar un nuevo elemento dict_plugin_info
porque ha confirmado que plugin_type
no está en dict_plugin_info
las claves, lo que cambiará el tamaño del diccionario durante la iteración.
d = {1: 1}
for _ in d:
# RuntimeError: dictionary changed size during iteration
d[2] = 2
Del código anterior, pudimos encontrar que no solo eliminar una clave (no se muestra en este código) sino también insertar una clave durante la iteración generará dicha excepción, excepto que el diccionario que se va a iterar está vacío.
d = dict()
for _ in d:
d[2] = 2 # OK