O PYCG gera gráficos de chamada para código Python usando análise estática. Ele suporta com eficiência
Você pode ler a metodologia completa, bem como uma avaliação completa no artigo ICSE 2021.
Você pode citar o Pycg da seguinte maneira. Vitalis Salis, Thodoris Sotiropoulos, Panos Louridas, Diomidis spinellis e Dimitris Mitropoulos. Pycg: geração de gráficos de chamadas práticas em Python. Na 43ª Conferência Internacional sobre Engenharia de Software, ICSE '21 , 25-28 de maio de 2021.
Pycg está arquivado. Devido à disponibilidade limitada, não foram planejadas melhorias adicionais no desenvolvimento. Feliz em ajudar qualquer pessoa que queira criar um garfo para continuar o desenvolvimento.
O PYCG é implementado no Python3 e requer Python versão 3.4 ou superior. Também não tem dependências. Simplesmente:
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
Os seguintes argumentos da linha de comando devem ser usados apenas quando --fasten for provado:
--product : o nome do pacote.--forge : Fonte do qual o pacote foi baixado.--version : a versão do pacote.--timestamp : o registro de data e hora da versão do pacote. As bordas da chamada estão na forma de uma lista de adjacência em que uma borda (src, dst) é representada como uma entrada de dst na lista atribuída à chave src :
{
"node1": ["node2", "node3"],
"node2": ["node3"],
"node3": []
}
Para uma descrição atualizada do formato FETEN, consulte o Wiki Fasten.
Atualmente, estamos experimentando a identificação de possíveis acessos de dicionário inválido nos dicionários de Python (erros -chave). O formato de saída para erros importantes é uma lista de dicionários que contêm:
[{
"filename": "mod.py",
"lineno": 2,
"namespace": "mod.<dict1>",
"key": "key2"
},
{
"filename": "mod.py",
"lineno": 8,
"namespace": "mod.<dict1>",
"key": "nokey"
}]
Todos os pontos de entrada são conhecidos e queremos o formato JSON simples
~ >>> pycg --package pkg_root pkg_root/module1.py pkg_root/subpackage/module2.py -o cg.json
Todos os pontos de entrada não são conhecidos e queremos o formato JSON simples
~ >>> pycg --package django $(find django -type f -name "*.py") -o django.json
Queremos o formato AFETEN:
~ >>> 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
No diretório raiz, primeiro instale o pacote simulado:
pip3 install mock
Τhen, basta executar os testes executando:
make test