
Текущая разработка Call Map ведётся на https://github.com/ajylee/call_map. Call Map — это инструмент для навигации по графам вызовов Python.
.. default-role:: code
Call Map — это инструмент для навигации по графам вызовов в Python, с планами
поддержки других языков. Ниже приведён снимок экрана после выполнения call_map -m toolz и
последующего щелчка по некоторым функциям.
.. figure:: docs/UI-clicked-on-function.png
Хотя Call Map предназначен для помощи в получении общего представления о кодовой базе, он также естественно подходит для трассировки путей выполнения кода, что является важной проблемой безопасности. Многие проблемы безопасности выявляются путём поиска пути выполнения, который соединяет пользовательский ввод с опасными шаблонами кода.
Подробнее см. в записи в блоге__.
Call Map распространяется как пакет Python для Python 3.5. Чтобы установить с помощью
pip3, выполните::
pip3 install -e .
Обратите внимание, что в некоторых дистрибутивах Python 3 менеджер пакетов называется pip, а в некоторых
— pip3, поэтому вам, возможно, придётся заменить pip3 на pip.
Приведённые выше команды должны установить исполняемый файл call_map в тот же путь,
где находится интерпретатор Python.
Подробности и альтернативные способы см. в INSTALL.rst.
Откройте файлы, чтобы начать изучение::
call_map -f example.py
call_map -f *.py
Вы также можете добавить путь в путь поиска модулей (sys.path)::
call_map -f *.py -p .
Call Map попытается разрешить файлы как модули, когда их можно найти в
пути поиска модулей. Дополнительную документацию по аргументам командной строки
см. в call_map -h.
Чтобы настроить Call Map, задайте переменную окружения CALL_MAP_RC_DIRECTORY. Путь к файлу конфигурации Call Map будет следующим::
$CALL_MAP_RC_DIRECTORY/call_map_rc.py
В настоящее время параметры конфигурации таковы:
open_in_editor(path: pathlib.Path, line: int): если вы определите эту функцию,
она будет вызываться каждый раз при открытии файла. Например, следующий код можно
использовать для открытия файлов в сервере Emacs, если вы вызвали server-mode в
запущенном сеансе Emacs::
def open_in_editor(path, line): import subprocess as sbp sbp.call(['emacsclient', '+{}'.format(line), str(path)])
Следующий код можно использовать для открытия файлов в сервере GVim, если вы запустили GVim
сервер с помощью gvim --servername my_vim_server::
def open_in_editor(path, line): import subprocess as sbp sbp.call(['gvim', '--servername', 'my_vim_server', '--remote', '+{}'.format(line), str(path)])
MULTITHREADING: указывает, использовать ли отдельный поток для графического интерфейса и поиска
по графу вызовов. По умолчанию — True. Его отключение предназначено для отладки.
В дизайне интерфейса есть пара причуд, связанных с тем, что я не нашёл лучшего решения или компромисс с дополнительной сложностью невыгоден.
Использования могут отображаться более одного раза, но на самом деле это разные использования в одной и той же области видимости.
Вы можете заметить, что некоторые встроенные функции, такие как help, id и filter, игнорируются.
Полный список игнорируемых функций см. в call_map/config.py
в исходном коде.
Если позиция, которую нужно подсветить, находится в начале файла, она не будет подсвечена. Это связано с тем, что обычно только модули и скрипты находятся в начале соответствующих файлов.
Некоторые причуды унаследованы от бэкенда анализа Python jedi.
Область поиска использований — это набор модулей, загруженных
бэкендом jedi. Это означает, что область будет меняться по мере изучения новых
модулей. Если вы хотите явно включить модуль в область поиска, добавьте
его в исходный список модулей для проверки.
jedi всегда ищет в sys.path интерпретатора, даже если он не
указан явно. Однако он будет отдавать приоритет пользовательскому sys_path.
Любые оговорки, которые существуют для бэкендов статического анализа, также применимы к Call Map. (В
настоящее время в Call Map интегрирован только бэкенд jedi.)
Бэкенд jedi для анализа Python не всегда находит все использования. Динамическая
природа Python не позволяет статическому анализу всегда точно определять,
где определена функция. Иногда jedi разрешает вызов в несколько
возможных функций. Например, os.path.abspath зависит от платформы. В
этом случае call_map перечисляет обе возможности как abspath и abspath (2).
jedi также не разрешает все вызовы и использования. В документации самого Jedi также
есть список оговорок__.
Иногда, когда Jedi выдаёт ошибку при анализе одного элемента, ошибка влияет на другие элементы. Например, при поиске использований, если Jedi выдаёт ошибку для одного использования, другие найденные им использования могут быть невосстановимы (по состоянию на Jedi v0.10.0).
__ https://jedi.readthedocs.io/en/latest/docs/features.html#caveats