Importation de modules de cartographie en Python pour un remaniement facile
j'ai un tas de modules Python que je veux nettoyer, réorganiser et remanier (il y a du code dupliqué, du code non utilisé ...), et je me demande s'il y a un outil pour faire une carte de quel module utilise quel autre module.
dans l'idéal, j'aimerais une carte comme ceci:
main.py
-> task_runner.py
-> task_utils.py
-> deserialization.py
-> file_utils.py
-> server.py
-> (deserialization.py)
-> db_access.py
checkup_script.py
re_test.py
main_bkp0.py
unit_tests.py
... de sorte que je puisse dire quels fichiers je peux commencer à se déplacer d'abord (file_utils.py, db_access.py), les fichiers ne sont pas utilisés par mes main.py et peuvent donc être supprimés, etc. (Je suis en fait travailler avec environ 60 modules)
Écriture d'un script qui ne ce ne serait probablement pas très compliqué (bien qu'il y ait différents syntaxes pour importer à manipuler), mais je m'attendrais aussi à ce que je ne suis pas le premier à vouloir faire cela (et si quelqu'un a fait un outil pour cela, il pourrait inclure d'autres fonctionnalités soignées telles que me dire quelles classes et fonctions ne sont probablement pas utilisées).
connaissez-vous des outils (même des scripts simples) qui aident le code réorganisation?
connaissez-vous un terme plus exact pour ce que j'essaie de faire? Réorganisation de Code?
4 réponses
Python modulefinder
cette. Il est assez facile d'écrire un script qui transformera cette information en un graphique d'importation (que vous pouvez rendre avec par exemple graphviz):explication claire. Il y a aussi snakefood
qui fait tout le travail pour vous (et l'utilisation des AST, aussi!)
Vous voudrez peut-être regarder dans pylint
ou pychecker
pour les tâches de maintenance plus générales.
Écriture d'un script qui ne ce ne serait probablement pas très compliqué (même si il y a des syntaxes différentes pour l'importation de la poignée),
C'est trivial. Il y a import
et from module import
. Deux syntaxe à manipuler.
connaissez-vous un terme plus exact pour ce que j'essaie de faire? Réorganisation de Code?
Design. Il est appelé design. Oui, vous réaménagez un design existant. , mais...
Règle 1
ne commencez pas un travail de conception avec ce que vous avez. Si vous le faites, vous ne ferez que "grignoter sur les bords", apportant des changements mineurs et parfois sans conséquence.
Règle 2
commencez un effort de conception avec ce que vous devrait si vous aviez été plus intelligent. Pensez largement et clairement à ce que vous êtes vraiment censé faire. Ignorer ce que vous faire.
Règle 3
Design à partir de la base (ou novo comme certains disent) avec l'architecture correcte du paquet et du module.
créer un projet séparé pour cela.
Règle Quatre
Tester En Premier. Écrivez des tests unitaires pour votre nouvelle architecture. Si vous avez des tests unitaires existants, copiez-les dans le nouveau projet. Modifier les importations pour refléter la nouvelle architecture et réécrire les tests pour exprimer votre nouvelle simplification glorieuse.
tous les tests échouent, parce que vous n'avez déplacé aucun code. C'est une bonne chose.
Règle Cinq
Déplacer le code dans la nouvelle structure en dernier. Arrêtez de déplacer le code quand les tests sont réussis.
Vous n'avez pas besoin d'analyser les importations pour ce faire, BTW. Vous êtes tout simplement à l'aide de grep
pour trouver les modules et les classes. Les vieilles importations et les relations enchevêtrées entre les vieux importations n'a pas d'importance, et n'a pas besoin d'être analysé. Vous êtes à la jeter. Vous n'avez pas besoin d'outils plus intelligents que grep
.
Si l'envie de passer le code, vous devez être très discipliné. (1) vous devez avoir test(s) qui échouent et puis (2) Vous pouvez déplacer un peu de code pour réussir le test(s) d'échec.
chuckmove est un outil qui vous permet de réécrire récursivement les importations dans toute l'arborescence des sources pour faire référence à un nouvel emplacement d'un module.
chuckmove --old sound.utils --new media.sound.utils src
...cela descend dans src, et réécrit les déclarations d'importation son.utils pour importer des médias.son.utils à la place. Il prend en charge toute la gamme des formats d'importation Python. I. e. from x import y
,import x.y.z as w
etc.
après une erreur en utilisant Python 3.5 et modulefinder j'ai trouvé pydeps et cela a très bien fonctionné, produisant un bon graphique des dépendances. Vous aurez besoin d'installer python-pygraphviz
pour l'utiliser.
(l'erreur était liée à une certaine différence dans l'async en Python 3.6 comparé à 3.5 comme discuté ici)