Импортирование модуля отображения в Python для легкого рефакторинга - PullRequest
14 голосов
/ 26 августа 2010

У меня есть несколько модулей Python, которые я хочу очистить, реорганизовать и реорганизовать (есть некоторый дублирующий код, некоторый неиспользуемый код ...), и мне интересно, есть ли инструмент для составления карты, в которой модуль используеткакой другой модуль.

В идеале, я бы хотел карту, подобную этой:

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

... чтобы я мог сказать, какие файлы я могу начать перемещать в первую очередь (file_utils.py, db_access.py), какие файлы не используются моим main.py и поэтому могут быть удалены и т. д. (на самом деле я работаю с около 60 модулями)

Написание сценария, который делает это, вероятно, не будетможет быть очень сложным (хотя существуют разные синтаксисы для обработки импорта), но я также ожидаю, что я не первый, кто захочет сделать это (и если кто-то создал инструмент для этогоэто может включать и другие полезные функции, такие как указание, какие классы и функции, вероятно, не используются).

Вам известны какие-либо инструменты (даже простые сценарии), которые помогают реорганизации кода?

вы знаете большеточный термин для того, что я пытаюсь сделать?Реорганизация кода?

Ответы [ 4 ]

14 голосов
/ 26 августа 2010

Python's modulefinder делает это. Довольно легко написать скрипт, который превратит эту информацию в график импорта (который вы можете отобразить, например, с помощью graphviz ): вот ясное объяснение . Также есть snakefood, который делает всю работу за вас (и с использованием AST тоже!)

Возможно, вы захотите посмотреть pylint или pychecker для более общих задач обслуживания.

4 голосов
/ 26 августа 2010

Написание сценария, который делает это, вероятно, не будет очень сложным (хотя есть разные синтаксисы для обработки импорта)

Это тривиально. Там import и from module import. Два синтаксиса для обработки.

Вы знаете более точный термин для того, что я пытаюсь сделать? Реорганизация кода?

Дизайн. Это называется дизайн . Да, вы реорганизуете существующий дизайн, но ...

Правило первое

Не начинайте проектирование с того, что у вас есть. Если вы это сделаете, вы будете только «грызть края», делая небольшие, а иногда и несущественные изменения.

Правило второе

Начните проектирование с того, что должно было бы иметь, если бы вы были умнее. Подумайте широко и четко о том, что вы действительно должны делать. Не обращай внимания на то, что ты сделал.

Правило три

Дизайн с нуля (или de novo , как говорят некоторые люди) с правильной архитектурой пакетов и модулей.

Создайте для этого отдельный проект.

Правило четвертое

Тест первый. Напишите модульные тесты для вашей новой архитектуры. Если у вас есть модульные тесты, скопируйте их в новый проект. Измените импорт, чтобы отразить новую архитектуру, и перепишите тесты, чтобы выразить свое великолепное упрощение.

Все тесты не пройдены, потому что вы не переместили код. Это хорошо.

Правило пятое

Переместить код в новую структуру в последнюю очередь. Прекратите перемещение кода после прохождения тестов.

Вам не нужно анализировать импорт, чтобы сделать это, кстати. Вы просто используете grep для поиска модулей и классов. Старый импорт и запутанные отношения между старым импортом не имеют значения, и их не нужно анализировать. Вы выбрасываете это. Вам не нужны инструменты умнее, чем grep.

Если вы чувствуете желание переместить код, вы должны быть очень дисциплинированными. (1) у вас должны быть тесты, которые не пройдены, и затем (2) вы можете переместить некоторый код для прохождения тестов, которые не прошли.

2 голосов
/ 14 января 2016

chuckmove - это инструмент, который позволяет рекурсивно переписывать импорт во всем дереве исходных текстов для ссылки на новое местоположение модуля.

chuckmove --old sound.utils --new media.sound.utils src

... это происходит в src и переписывает операторы, которые импортируют sound.utils для импорта media.sound.utils.Он поддерживает весь спектр форматов импорта Python.Т.е. from x import y, import x.y.z as w и т. Д.

0 голосов
/ 27 сентября 2018

Modulefinder может не работать с Python 3.5 *, но pydeps работал очень хорошо:

Установка:

sudo apt install python-pygraphviz
pip install pydeps

Затем в каталоге, из которого вы хотите отобразить,

pydeps --max-bacon=0 .

.. для создания карты максимальной глубины.

* Проблема в Python 3.5, но не 3.6, вызвала проблемы с modulefinder, подобно this

...