Импорт модулей сопоставления в 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, который делает это, вероятно, не очень сложно (хотя для импорта нужны разные синтаксисы), но я также ожидал, что я не первый, кто захочет это сделать ( и если кто-то создал инструмент для этого, он может включать в себя другие опрятные функции, такие как рассказывать мне, какие классы и функции, вероятно, не используются).
Знаете ли вы какие-либо инструменты (даже простые скрипты), которые помогают реорганизации кода?
Знаете ли вы более точный термин для того, что я пытаюсь сделать? Реорганизация кода?
Ответы
Ответ 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
и т.д.