Existe-t-il un IDE/utilitaire pour refactoriser les importations Python * pour utiliser le module standard.membre de la syntaxe?

J'ai récemment été chargé de maintenir un tas de code qui utilise from module import * assez fortement.

Cette base de code est devenue assez grande pour importer des conflits/nommer l'ambiguïté / " d'où vient cette fonction, il y a comme huit modules importés qui en ont un avec le même nom?!"ism sont devenus de plus en plus commun.

Pour aller de l'avant, j'ai utilisé des membres explicites (c'est-à-dire import module ... module.object.function() pour rendre le travail de maintenance plus lisible.

Mais je me demandais: existe-t-il un IDE ou un utilitaire qui analyse vigoureusement le code Python et les instructions refactors * import dans les instructions d'importation de module, puis ajoute le chemin complet du module à toutes les références aux membres de ce module?

Nous n'utilisons pas fortement metaprogramming / reflection / inspect / monkeypatching, donc si l'IDE/util susmentionné se comporte mal avec de telles choses, c'est OK.

24
demandé sur karthikr 2012-10-01 20:14:09

2 réponses

Pas une solution parfaite, mais ce que je fais habituellement est ceci:

  1. Ouvrir Pydev
  2. supprimer toutes les importations *
  3. Utilisez la commande optimize imports (ctrl+shift+o) pour ajouter à nouveau toutes les importations

Résout grossièrement le problème :)


Si vous voulez construire une solution vous-même, essayez de http://docs.python.org/library/modulefinder.html

4
répondu Wolph 2012-10-08 22:51:25

Voici les autres outils mentionnés:

  • travailler avec AST directement, ce qui est très bas-niveau pour votre utilisation.
  • travailler avec modulefinder qui peut avoir beaucoup de code standard que vous recherchez,
  • rope , une bibliothèque de refactoring (@Lucas Graf),
  • le homme de réparation de vélos , une bibliothèque de refactoring
  • la bibliothèque logilab-astng utilisée dans pylint

En savoir plus sur pylint

pylint est un très bon outil construit sur ast qui est déjà capable de vous dire où dans votre code il y a des instructions from somemodule import *, ainsi que de vous dire quelles importations ne sont pas nécessaires.

Exemple:

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

Cela va se plaindre:

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 ...

Vers une solution?

Notez que dans la sortie ci-dessus pylint Vous donne les numéros de ligne. cela pourrait être un effort, mais un outil de refactoring peut regardez ces avertissements particuliers, obtenez le numéro de ligne, importez le module et regardez la liste __all__, ou utilisez une instruction execfile() en bac à sable pour voir les noms globaux du module (modulefinder aiderait-il? peut-être...). Avec la liste des noms globaux de __all__ et les noms dont pylint se plaint, vous pouvez avoir deux set() et procéder à la différence. Remplacez la ligne contenant des importations génériques par des importations spécifiques.

2
répondu dnozay 2012-10-14 02:06:19