Python prompt TypeError: super (type, obj): obj debe ser una instancia o subtipo de tipo

Python Prompt Typeerror

Python prompt TypeError: super (type, obj): obj debe ser una instancia o subtipo de tipo

  1. Describe brevemente el problema

Un día en el trabajo, el código de Python que funciona normalmente bajo depuración se compila y ejecuta, pero arroja una excepción, que indica 'TypeError: super (type, obj): obj must be an instance or subtipo of type'. La causa de este problema es que los tipos type y obj son inconsistentes (es decir, el objeto obj no es creado por una clase de type type), pero funciona bajo depuración. De repente pensé si se debía al uso del módulo pyd después de la compilación, y hubo un problema cuando se cargó el módulo.



Para encontrar la causa del error, se construyó el código de prueba y se repitió el proceso de error. El módulo se importó repetidamente. Para el módulo pyd, el nombre del módulo debe usarse cuando se usa la api load_module, de lo contrario la importación fallará, pero a veces el nombre debe modificarse porque puede haber módulos con el mismo nombre pero diferentes funciones en el directorio, si no modifica el módulo importado después de que el nombre sobrescriba el módulo previamente importado, consulte la Figura 1.1 código de prueba.



El problema ahora es cambiar el nombre, pero se descubre que todavía puede haber un problema de sobrescribir la importación. Después de la segunda importación, el primer objeto creado con éxito arrojará 'TypeError: super (type, obj): obj debe ser una instancia o el subtipo de tipo es anormal, como se muestra en el código de prueba de la Figura 1.1.



Higo 1.1 Código de prueba

  1. causas del problema

1. Puede activarse después de importar 'a' (porque el nombre es el mismo que a). La operación de recarga modifica el objeto de un módulo. Debido a la existencia de una referencia (puede ser una estructura de datos parcialmente invisible), también afecta a 'a1' ¿Parte de los datos dentro del objeto del módulo? Esto conduce a extrañas anomalías.



2. Puede activarse después de importar 'a' (porque el nombre es el mismo que a). La operación de recarga modifica el objeto del módulo a, lo que hace que el intérprete de pyhton interprete los módulos a y a1 de acuerdo con el módulo después de la recarga. .

Simplemente verifique la declaración anterior. Cree una nueva carpeta llamada ayb en el directorio raíz del proyecto y coloque el módulo a.pyd. El código de prueba del módulo se muestra en la Figura 2.1. Este programa se equivoca cuando llega a las 16 líneas. Indica que el tipo del objeto actual no es coherente con el tipo de la clase (lo que indica que el objeto actual no es una instancia de esta clase). Por supuesto, este error se produce después de importar repetidamente el módulo a. Antes de llamar al método get, no hubo ninguna excepción, como se muestra en la Figura 2.2.

Higo 2.1 un archivo fuente del módulo .pyd

Higo 2.2 Código de prueba 1

La siguiente prueba es crear objetos b_obj a través de la clase a1_module.B y objetos re_b_obj a través de la clase re_a_module.B, e imprimir los ID internamente para mostrar que sus ID son los mismos. Todos son 76028552, que es el id de re_a_module.B, que indica python. Cuando el intérprete interpreta internamente, también interpreta la primera clase importada como una clase sobrecargada posterior, lo que genera un TypeError al crear una instancia de super. En resumen, el supuesto 2 se cumple, consulte la Figura 2.3.

Higo 2.3 Código de prueba 2

  1. Solución
    1. Caso de simulación

Después del análisis, creo que mientras el módulo no se vuelva a cargar, el problema se puede evitar, por lo que después de la primera importación del módulo, el módulo 'a' se extrae del diccionario del módulo del sistema y el módulo exportado se actualiza a sys con la clave de 'a1'. Los módulos pueden resolver los problemas anteriores. Ejemplo: sys.modules.update ({'a1': sys.modules.pop ('a')}) ver figura 3.1.

Higo 3.1 Solución de caso de simulación