PYCG génère des graphiques d'appels pour le code Python en utilisant une analyse statique. Il soutient efficacement
Vous pouvez lire la méthodologie complète ainsi qu'une évaluation complète sur le document ICSE 2021.
Vous pouvez citer PYCG comme suit. Vitalis Salis, Thodoris Sotiopoulos, Panos louridas, Diomidis spinellis et Dimitris Mitropoulos. PYCG: Génération de graphiques d'appel pratique dans Python. En 43e Conférence internationale sur l'ingénierie logicielle, ICSE '21 , 25-28 mai 2021.
PYCG est archivé. En raison de la disponibilité limitée, aucune autre amélioration du développement n'est prévue. Heureux d'aider quiconque veut créer une fourche pour continuer le développement.
PYCG est implémenté dans Python3 et nécessite Python version 3.4 ou plus. Il n'a pas non plus de dépendances. Simplement:
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
Les arguments de ligne de commande suivants ne devraient être utilisés que lorsque --fasten est prouvé:
--product : le nom du package.--forge : Source le package a été téléchargé à partir de.--version : la version du package.--timestamp : l'horodatage de la version du package. Les bords d'appel se présentent sous la forme d'une liste d'adjacence où un bord (src, dst) est représenté comme une entrée de dst dans la liste attribuée à Key src :
{
"node1": ["node2", "node3"],
"node2": ["node3"],
"node3": []
}
Pour une description à jour du format d'attache, reportez-vous au wiki attaché.
Nous expérimentons actuellement sur l'identification des accès de dictionnaire invalide potentiels sur les dictionnaires Python (erreurs clés). Le format de sortie pour les erreurs clés est une liste de dictionnaires contenant:
[{
"filename": "mod.py",
"lineno": 2,
"namespace": "mod.<dict1>",
"key": "key2"
},
{
"filename": "mod.py",
"lineno": 8,
"namespace": "mod.<dict1>",
"key": "nokey"
}]
Tous les points d'entrée sont connus et nous voulons le format JSON simple
~ >>> pycg --package pkg_root pkg_root/module1.py pkg_root/subpackage/module2.py -o cg.json
Tous les points d'entrée ne sont pas connus et nous voulons le format JSON simple
~ >>> pycg --package django $(find django -type f -name "*.py") -o django.json
Nous voulons le format d'attache:
~ >>> 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
Dans le répertoire racine, installez d'abord le package Mock:
pip3 install mock
EXEMBLEZ-NEZ simplement les tests en exécutant:
make test