PYCG genera gráficos de llamadas para el código Python utilizando análisis estático. Admite eficientemente
Puede leer la metodología completa, así como una evaluación completa en el documento ICSE 2021.
Puedes citar PYCG de la siguiente manera. Vitalis Salis, Thodoris Sotiropoulos, Panos Louridas, Diomidis spinellis y Dimitris Mitropoulos. PYCG: Generación práctica de gráficos de llamadas en Python. En la 43ª Conferencia Internacional sobre Ingeniería de Software, ICSE '21 , 25–28 de mayo de 2021.
PYCG está archivado. Debido a la disponibilidad limitada, no se planifican más mejoras de desarrollo. Feliz de ayudar a cualquiera que quiera crear una bifurcación para continuar el desarrollo.
PYCG se implementa en Python3 y requiere Python versión 3.4 o superior. Tampoco tiene dependencias. Simplemente:
pip install pycg
~ >>> pycg -h
usage: __main__.py [-h] [--package PACKAGE] [--fasten] [--product PRODUCT]
[--forge FORGE] [--version VERSION] [--timestamp TIMESTAMP]
[--max-iter MAX_ITER] [--operation {call-graph,key-error}]
[--as-graph-output AS_GRAPH_OUTPUT] [-o OUTPUT]
[entry_point ...]
positional arguments:
entry_point Entry points to be processed
optional arguments:
-h, --help show this help message and exit
--package PACKAGE Package containing the code to be analyzed
--fasten Produce call graph using the FASTEN format
--product PRODUCT Package name
--forge FORGE Source the product was downloaded from
--version VERSION Version of the product
--timestamp TIMESTAMP
Timestamp of the package's version
--max-iter MAX_ITER Maximum number of iterations through source code. If not specified a fix-point iteration will be performed.
--operation {call-graph,key-error}
Operation to perform. Choose call-graph for call graph generation (default) or key-error for key error detection on dictionaries.
--as-graph-output AS_GRAPH_OUTPUT
Output for the assignment graph
-o OUTPUT, --output OUTPUT
Output path
Los siguientes argumentos de línea de comando deben usarse solo cuando se proporciona --fasten :
--product : el nombre del paquete.--forge : Fuente se descargó el paquete.--version : la versión del paquete.--timestamp : la marca de tiempo de la versión del paquete. Los bordes de llamadas están en forma de una lista de adyacencia donde un borde (src, dst) se representa como una entrada de dst en la lista asignada a la clave src :
{
"node1": ["node2", "node3"],
"node2": ["node3"],
"node3": []
}
Para obtener una descripción actualizada del formato de suministro, consulte la wiki de sujeción.
Actualmente estamos experimentando para identificar posibles accesos de diccionario inválidos en diccionarios de Python (errores clave). El formato de salida para errores clave es una lista de diccionarios que contienen:
[{
"filename": "mod.py",
"lineno": 2,
"namespace": "mod.<dict1>",
"key": "key2"
},
{
"filename": "mod.py",
"lineno": 8,
"namespace": "mod.<dict1>",
"key": "nokey"
}]
Todos los puntos de entrada son conocidos y queremos el formato JSON simple
~ >>> pycg --package pkg_root pkg_root/module1.py pkg_root/subpackage/module2.py -o cg.json
No se conocen todos los puntos de entrada y queremos el formato JSON simple
~ >>> pycg --package django $(find django -type f -name "*.py") -o django.json
Queremos el formato de cierre:
~ >>> pycg --package pypi_pkg --fasten --product "pypipkg" --forge "PyPI"
--version "0.1" --timestamp 42
pypi_pkg/module1.py pkg_root/subpackage/module2.py -o cg.json
Desde el directorio root, primero instale el paquete simulado:
pip3 install mock
Τhen, simplemente ejecute las pruebas ejecutando:
make test