PYCGは、静的分析を使用してPythonコードのコールグラフを生成します。効率的にサポートします
ICSE 2021ペーパーの完全な評価と同様に、完全な方法論を読むことができます。
次のようにPYCGを引用できます。 Vitalis Salis、Thodoris Sotiropoulos、Panos Louridas、Diomidis Spinellis、Dimitris Mitropoulos。 PYCG:Pythonの実用的なコールグラフ生成。 2021年5月25〜28日、 ICSE '21のソフトウェアエンジニアリングに関する第43回国際会議。
PYCGがアーカイブされています。利用可能性が限られているため、さらなる開発の改善は計画されていません。開発を継続するためにフォークを作成したい人を助けてくれてうれしいです。
PYCGはPython3に実装されており、Pythonバージョン3.4以降が必要です。依存関係もありません。単に:
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
次のコマンドライン引数は、 --fastenが証明された場合にのみ使用する必要があります。
--product :パッケージの名前。--forge :ソースパッケージはダウンロードされました。--version :パッケージのバージョン。--timestamp :パッケージのバージョンのタイムスタンプ。コールエッジは、キーsrcに割り当てられたリストのdstのエントリとしてエッジ(src, dst)が表される隣接リストの形式です。
{
"node1": ["node2", "node3"],
"node2": ["node3"],
"node3": []
}
固定形式の最新の説明については、Fashen Wikiを参照してください。
現在、Python辞書での潜在的な無効な辞書アクセスの識別を実験しています(キーエラー)。キーエラーの出力形式は、以下を含む辞書のリストです。
[{
"filename": "mod.py",
"lineno": 2,
"namespace": "mod.<dict1>",
"key": "key2"
},
{
"filename": "mod.py",
"lineno": 8,
"namespace": "mod.<dict1>",
"key": "nokey"
}]
すべてのエントリポイントが既知であり、簡単なJSON形式が必要です
~ >>> pycg --package pkg_root pkg_root/module1.py pkg_root/subpackage/module2.py -o cg.json
すべてのエントリポイントは不明であり、簡単なJSON形式が必要です
~ >>> pycg --package django $(find django -type f -name "*.py") -o django.json
固定形式が必要です。
~ >>> 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
ルートディレクトリから、最初にモックパッケージをインストールします。
pip3 install mock
hen、実行してテストを実行するだけです。
make test