¿Existe un IDE / utilidad para refactorizar las importaciones de Python * para usar la syntax estándar de module.member?

Hace poco me encargué de mantener un montón de código que usa bastante from module import * .

Este código base se ha vuelto lo suficientemente grande como para importar conflictos / nombrar ambigüedad / “¿de dónde diablos vino esta función, hay como ocho módulos importados que tienen uno con el mismo nombre?!” Ism se han vuelto cada vez más comunes.

En el futuro, he estado utilizando miembros explícitos (es decir, import module ... module.object.function() para que el trabajo de mantenimiento sea más legible.

Pero me preguntaba: ¿hay un IDE o una utilidad que analice de manera sólida el código Python y refactorice * las declaraciones de importación en las instrucciones de importación del módulo, y luego antepase la ruta completa del módulo a todas las referencias a los miembros de ese módulo?

No estamos usando metaprogtwigción / reflexión / inspect / parpadeo en gran medida, por lo que si el IDE / utilidad antes mencionado se comporta mal con tales cosas, está bien.

No es una solución perfecta, pero lo que suelo hacer es esto:

  1. Abrir pydev
  2. Eliminar todas las importaciones *
  3. Use el comando optimize imports ( ctrl+shift+o ) para volver a agregar todas las importaciones

Resuelve el problema a grandes rasgos 🙂


Si desea crear una solución usted mismo, intente http://docs.python.org/library/modulefinder.html

Aquí están las otras herramientas relacionadas mencionadas:

  • Trabajar directamente con AST , que es de muy bajo nivel para su uso.
  • trabajando con modulefinder que puede tener una gran cantidad del código de boiler que buscas,
  • cuerda , una biblioteca de refactorización (@Lucas Graf),
  • El reparador de bicicletas , una biblioteca refactorización.
  • La biblioteca logilab-astng utilizada en el pylint

Más sobre pylint

pylint es una muy buena herramienta construida sobre ast que ya puede decirle en qué parte de su código hay from somemodule import * , así como decirle qué importaciones no son necesarias.

ejemplo:

 # next is what's on line 32 from re import * 

esto se quejará:

 W: 32,0: Wildcard import re W: 32,0: Unused import finditer from wildcard import W: 32,0: Unused import LOCALE from wildcard import ... # this is a long list ... 

¿Hacia una solución?

Tenga en cuenta que en el pylint salida anterior pylint da los números de línea. puede ser un poco de esfuerzo, pero una herramienta de refactorización puede ver esas advertencias en particular, obtener el número de línea, importar el módulo y mirar la lista __all__ , o usar una statement execfile() sandbox para ver los nombres globales del módulo. ¿Con eso? tal vez …). Con la lista de nombres globales de __all__ y los nombres de los que pylint queja, puede tener dos set() y proceder a obtener la diferencia. Reemplace la línea que ofrece importaciones de comodines con importaciones específicas.