programming practices good coding code best python syntax ide refactoring readability

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



programming standards (2)

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 usando 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 metaprogramació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:

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 declaración execfile() sandbox para ver los nombres globales del módulo (sería modulefinder ayuda ¿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 con importaciones de comodines con importaciones específicas.