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:
- Abrir pydev
- Eliminar todas las importaciones
*
- 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 http://docs.python.org/library/modulefinder.html que puede tener una gran cantidad del código de boiler que buscas,
- rope , 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 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.