Подтвердить что ты не робот

Импорт модулей сопоставления в Python для простого рефакторинга

У меня есть куча модулей 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 и поэтому могут быть удалены и т.д. (I ' m фактически работает с примерно 60 модулями)

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

Правило 1

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

Правило 2

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

Правило три

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

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

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

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

Все тесты не работают, потому что вы не переместили какой-либо код. Это хорошая вещь.

Правило 5

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

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

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

Ответ 3

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 и т.д.