[python] クラス図を自動生成する


モチベーション

プルリクもらったときに,ざっと構造を理解しつつ,循環参照していないかをチェックするため,クラス図を自動作成したい。

方法

Pyreverseを使うと以下のような図が出力できる(上クラス図,下パッケージ図)。

本記事の検証環境

  • Windows10
  • python3.7.3
  • git-bash

環境構築手順

  1. pythonpipが使えることは前提とする。
  2. Pylintをインストールする。Pyreverseが一緒にインストールされる。
   pip install pylint
  1. 出力形式(dot, svg, png等)にかかわらず,Graphvizが必要なので,ここからインストーラを落としてインストールする。
  2. Graphvizのbinフォルダ(筆者環境だと「C:\Program Files (x86)\Graphviz2.38\bin」)のPATHを通す
  3. 出力可能な形式をdot -Txxxで確認する。ここでエラーが起きると,Graphvizのインストールができてないか,パスが通っていない。

    $ dot -Txxx
    Format: "xxx" not recognized. Use one of: bmp canon cmap cmapx cmapx_np dot emf emfplus eps fig gd gd2 gif gv imap imap_np ismap jpe jpeg jpg metafile pdf pic plain plain-ext png pov ps ps2 svg svgz tif tiff tk vml vmlz vrml wbmp xdot xdot1.2 xdot1.4
    
  4. インストールできたかテストする。

    pyreverse -o png -p Pyreverse pylint/pyreverse/
    

    以下の2つのファイル(冒頭の図)がカレントディレクトリの下にできていれば,インストール完了。

    • classes_Pyreverse.png
    • packages_Pyreverse.png

図の出力手順

pyreverse [option] <packages>
  • <packages>には変換したいパッケージ名を入れる。自作したpyファイルのファイル名・フォルダ名でもよい。フォルダを指定した場合は,そのサブフォルダ配下のすべてのpyファイルが解析される。ただし,__init__.pyがないとエラーが起きる。
  • pyreverseを実行することで,package diagramとclass diagramの2つが作成される。

以下,使いそうなオプションの説明。

  • -o, --outputオプションは変換する画像の拡張子を制御する(指定がないとdot形式になる)。出力可能な拡張子はdot -Txxxで確認できる。

    pyreverse -o png pylint/pyreverse/
    # 以下の二つのファイルが出力される。
    # classes.png
    # packages.png
    
  • -p, --projectオプションは変換後のファイル名の末尾を制御する。

    pyreverse -p TEST pylint/pyreverse/
    # 以下の二つのファイルが出力される。
    # classes_TEST.dot
    # packages_TEST.dot
    
  • -f, --filter-modeオプションによって,出力する属性をフィルターできる。デフォルトだと,PUB_ONLY(non-publicな属性をすべて非表示)になっている。ALLにすると,すべて表示できる。ほかにもSPECIAL(コンストラクター以外の特殊メソッドをフィルターする),OTHER(protectedとprivateの属性をフィルターする)モードがある。

    pyreverse -o png -f ALL pylint/pyreverse/
    
  • -k, --only-classnamesオプションを指定すると,クラス図でクラス名のみを出力する(メソッドや属性を出力しない。クラスの依存関係だけ)。

    pyreverse -o png -k pylint/pyreverse/
    

  • -m[yn], --module-names=[yn]オプションを使用すると,クラス図内のクラス名にモジュール名を追加するかどうかを選択できる。デフォルトだと-mn(追加しない)。-my(追加する)を指定したときの出力を以下に示す。

    pyreverse -o png -k -my pylint/pyreverse/
    

  • -A, --all-ancestorsオプションはプロジェクト内のすべてのクラスの祖先を表示する。また-S, --all-associatedオプションは関連するすべてのクラスを再帰的に表示する。自作パッケージを可視化するとき,この2つのオプションがないとスカスカなクラス図ができるので,毎回指定している気がする。

    pyreverse -o png -k -AS pylint/pyreverse/
    

  • その他のオプションは-hでヘルプを参照。クラス図で描画するクラスを限定したり,親や子の深さを指定したりもできる。正直英語がわかりにくい気がする(上記の説明文も雰囲気で訳した)

最後に

  • dot形式をご存じない方は,ここなど参照。
  • 図中の緑色を変更する方法はなさそう。緑は見づらいorz。
  • 使ってみてわかったが,クラス図はかなりクラス間の関係性に抜け漏れがある気がする。ダック・タイピングなpythonでは仕方のないことなのか。一応-ASオプションで足掻いてみることをお勧めする。
  • 一方でパッケージ図はかなり安定している(当たり前だが)。import関係を可視化したいときは役に立つかも。
  • pycharm だと自動でできるらしい。参考

参考にしたサイト