Hacer que pylint reconozca el cargador de módulos personalizado

Tengo un cargador de módulos personalizado que básicamente hace un poco de redirección. Me gustaría que pylint reconozca este cargador personalizado. Esta es mi situación:

root/ __init__.py new/ __init__.py foo.py bar.py old/ __init__.py 

Tengo muchos clientes importando old.foo . Escribí un cargador personalizado en el old/__init__.py para redirigir estos para importar new.foo bajo el capó. ¿Cómo obtengo pylint para reconocer esto? Cuando las import old.foo , se queja de que no puede encontrar old.foo . Esto es sólo un problema con pylint. Puedo obtener el código del cliente para reconocer el cargador personalizado sin ningún problema.

De la documentación de los módulos :

Los paquetes soportan un atributo especial más, __path__ . Esto se inicializa para ser una lista que contiene el nombre del directorio que contiene el paquete __init__.py antes de que se __init__.py el código en ese archivo. Esta variable puede ser modificada; hacerlo afecta a futuras búsquedas de módulos y subpaquetes contenidos en el paquete.

Entonces, si entiendo correctamente, desea redirigir cualquier referencia a old para redirigir a new , así que todo lo que necesita hacer es reemplazar la carpeta old con old.py que contiene esto:

 __path__ = ["new"] 

Luego, cuando algo intenta importar old.foo , terminará importando new.foo .

Debe recordar que pylint es un analizador estático y, como tal, en realidad no carga el archivo python (excepto en algunos casos donde no puede hacer lo contrario, por ejemplo, el código comstackdo). Como tal, no está al tanto de un importador personalizado u otros trucos que forman parte de la alta dinamismo de Python.

Habiendo dicho eso:

  • todavía puede escribir un plugin “cerebro” para astroid (la biblioteca bajo pylint) que ayudará a pylint a entender la especificidad de su código

  • Al confiar en un mecanismo estándar, como la manipulación de __path__ , tendrá más posibilidades de evitar tal necesidad, ya sea porque en algún momento pylint puede entender esto o porque alguien más habrá contribuido con un complemento para ese propósito.