Python RuntimerError, RuntimeError ('diccionario cambió de tamaño durante la iteración')

Resuelto Lu Lee asked hace 9 meses • 0 respuestas

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.

Lu Lee avatar Feb 16 '24 01:02 Lu Lee
Aceptado

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_infoporque ha confirmado que plugin_typeno está en dict_plugin_infolas 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
Jay Young avatar Feb 15 '2024 19:02 Jay Young