Вопрос по python-module, refactoring, module, python – Импортирование модуля отображения в Python для легкого рефакторинга

14

У меня есть несколько модулей 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   ответа
0

pydeps работал очень хорошо

Монтаж:

sudo apt install python-pygraphviz
pip install pydeps

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

pydeps --max-bacon=0 .

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

* Проблема в Python 3.5, но не 3.6, вызвала проблемы с modulefinder, аналогичноэтот

2

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

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

4

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Переписывание с нуля часто нецелесообразно и может привести к синдрому Duke Nukem Forever. Antimony
+1. и не забывайimport module.submod as submod как вариант. Это растет на меня. aaronasterling
@aaronasterling: По-прежнему выглядитr"\s*import\s+.*" мне. S.Lott
14

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

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

Спасибо! Мне удалось получить именно ту карту, которую я искал, бесстыдно украдя код в объяснении, которое вы отправили, и ткнул его, пока он не дал мне нужный мне график. Я также использовал modulefinder для перечисления модулей, которые я не использовал (более половины), поэтому я мог просто взяться за ядерное оружие и больше не думать о них. Я также получил Pylint, но пока не играл с ним. Emile
Я не знал о змеиной еде, большое спасибо за ссылку. +1 user349594

Похожие вопросы