
El desarrollo actual de Call Map tiene lugar en https://github.com/ajylee/call_map. Call Map es una herramienta para navegar por grafos de llamadas de Python.
.. default-role:: code
Call Map es una herramienta para navegar por grafos de llamadas en Python, con planes de soportar
otros lenguajes. A continuación se muestra una captura de pantalla después de ejecutar call_map -m toolz, y luego
hacer clic en algunas funciones.
.. figure:: docs/UI-clicked-on-function.png
Si bien Call Map está pensado para ayudar a obtener una comprensión general de un código base, también es ideal para rastrear rutas de código, lo que constituye una preocupación de seguridad importante. Muchos problemas de seguridad se revelan al encontrar una ruta de código que conecta la entrada del usuario con patrones de codificación peligrosos.
Consulta la entrada de blog__ para más información.
Call Map se distribuye como un paquete de Python para Python 3.5. Para instalarlo con
pip3, ejecuta::
pip3 install -e .
Ten en cuenta que algunas distribuciones de Python 3 llaman al gestor de paquetes pip, y otras
lo llaman pip3, por lo que es posible que debas sustituir pip3 por pip.
Los comandos anteriores deberían instalar el ejecutable call_map en la misma ruta
en la que se encuentra el intérprete de Python.
Para más detalles y métodos alternativos, consulta INSTALL.rst.
Abre archivos para empezar a explorar::
call_map -f example.py
call_map -f *.py
También puedes añadir a la ruta de búsqueda de módulos (sys.path)::
call_map -f *.py -p .
Call Map intentará resolver los archivos como módulos siempre que puedan encontrarse en
la ruta de búsqueda de módulos. Para más documentación sobre los argumentos de línea de
comandos, call_map -h.
Para configurar Call Map, define la variable de entorno CALL_MAP_RC_DIRECTORY. La ruta al archivo de configuración de Call Map será::
$CALL_MAP_RC_DIRECTORY/call_map_rc.py
Por ahora, las opciones de configuración son:
open_in_editor(path: pathlib.Path, line: int): si defines esta función,
se llamará cada vez que abras un archivo. Por ejemplo, lo siguiente se puede
usar para abrir archivos en un servidor Emacs si has llamado a server-mode en una
sesión de Emacs en ejecución::
def open_in_editor(path, line): import subprocess as sbp sbp.call(['emacsclient', '+{}'.format(line), str(path)])
Lo siguiente se puede usar para abrir archivos en el servidor GVim si iniciaste un servidor GVim
con 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: Si se debe usar un hilo separado para la interfaz gráfica y la búsqueda
en el grafo de llamadas. El valor predeterminado es True. Desactivarlo es para fines de depuración.
Hay un par de peculiaridades en el diseño de la interfaz, debido a que no he llegado a una solución mejor o a que la compensación por una complejidad adicional es desfavorable.
Los usos pueden parecer que aparecen más de una vez, pero en realidad son usos diferentes en el mismo ámbito.
Puede que notes que algunas funciones integradas como help, id y filter se ignoran.
Consulta call_map/config.py en el código fuente para ver la lista completa de funciones
ignoradas.
Si la posición que se debe resaltar está al inicio de un archivo, no se resaltará. Esto se debe a que normalmente solo los módulos y scripts se encuentran al inicio de sus respectivos archivos.
Algunas peculiaridades se heredan del backend de análisis de Python jedi.
El ámbito de búsqueda de usos es el conjunto de módulos que ha cargado el
backend jedi. Eso significa que el ámbito cambiará a medida que explores nuevos
módulos. Si quieres incluir explícitamente un módulo en el ámbito de búsqueda, agrégalo
a la lista inicial de módulos que se inspeccionarán.
jedi siempre busca en el sys.path del intérprete, incluso cuando no está
incluido explícitamente. Sin embargo, priorizará el sys_path definido por el usuario.
Cualquier advertencia que exista para los backends de análisis estático también se aplica a Call Map. (Por
ahora solo el backend jedi está integrado en Call Map.)
El backend jedi para el análisis de Python no siempre encuentra todos los usos. La
naturaleza dinámica de Python hace imposible determinar siempre la definición de una función
con análisis estático. A veces jedi resuelve una llamada a múltiples funciones
posibles. Por ejemplo, os.path.abspath depende de la plataforma. En
este caso, call_map lista ambas posibilidades como abspath y abspath (2).
jedi tampoco resuelve todas las llamadas y usos. La propia documentación de Jedi también
tiene una lista de advertencias__.
A veces, cuando Jedi lanza un error al analizar un elemento, el error afecta a otros elementos. Por ejemplo, al buscar usos, si Jedi produce un error en un uso, los otros usos que haya encontrado pueden ser irrecuperables (a partir de Jedi v0.10.0).
__ https://jedi.readthedocs.io/en/latest/docs/features.html#caveats