Я поддерживаю старую базу кода, написанную на python. В частности, существует сложный фрагмент кода, который из модуля вызывает другие функции из других модулей, которые вызывают другие функции и так далее. Это не ООП, просто функции и модули.
Я пытался отследить, где начинается и заканчивается поток, каждый раз, когда я вызываю основную функцию, но я чувствую, что мне нужно нарисовать это, потому что я теряюсь во вспомогательных вызовах.
Меня беспокоит то, что каждая функция вызывает несколько внешних функций в своем теле, чтобы выполнить свою задачу и вернуть значение вызывающей стороне.
Как я могу это нарисовать? Имеется в виду, какой тип диаграммы / графики будет подходящим для документирования такого поведения / кода?
Поэтому я не думаю, что было бы полезно рисовать диаграмму UML, а также блок-схему. График вызовов, может быть?
Ответы:
Я думаю, что вы ищете здесь диаграмму последовательности . Они позволяют визуализировать порядок, в котором различные модули вызывают друг друга с помощью стрелок.
Построить одно просто:
пример
Предположим, у нас есть следующий код, для которого мы хотим создать диаграмму последовательности:
Первое, что мы нарисуем, это точка входа (
main
), соединяющая методlong_division
. Обратите внимание, что в long_division создается поле, обозначающее область вызова метода. В этом простом примере прямоугольник будет иметь всю высоту нашей диаграммы последовательности из-за того, что это единственный прогон.Теперь мы позвоним,
find_largest_fit
чтобы найти наибольшее число, которое соответствует нашему рабочему номеру, и вернем его нам. Мы рисуем линию отlong_division
кfind_largest_fit
с другим полем, чтобы указать область для вызова функции. Обратите внимание, как окно заканчивается, когда возвращается множитель; это конец этой функции!Повторите несколько раз для большего числа, и ваш график должен выглядеть примерно так:
Заметки
Вы можете выбрать, хотите ли вы маркировать вызовы переданными именами переменных или их значениями, если вы хотите документировать только один конкретный случай. Вы также можете показать рекурсию с помощью вызывающей функции.
Кроме того, вы можете показывать здесь пользователей, предлагать им и достаточно легко показывать их ввод в систему. Это довольно гибкая система, которую, я думаю, вы найдете довольно полезной!
источник
Я думаю, что граф вызовов будет наиболее подходящей визуализацией. Если вы решите не делать это вручную, есть хороший небольшой инструмент,
pyan
который выполняет статический анализ файла python и может генерировать визуализированный граф вызовов с помощью файла graphviz dot (который может быть визуализирован в изображение). Было несколько разветвлений, но наиболее полнофункциональный - https://github.com/davidfraser/pyan .Вам просто нужно указать все файлы, которые вы хотите обработать при запуске команды:
python ~/bin/pyan.py --dot a.py b.py c.py -n > pyan.dot; dot -Tpng -opyan.png pyan.dot
или же
python ~/bin/pyan.py --dot $(find . -name '*.py') -n > pyan.dot; dot -Tpng -opyan.png pyan.dot
Вы можете сделать график чище с помощью '-n', который удаляет строки, показывающие, где была определена функция.
источник