Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

モチベーション

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

方法

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

本記事の検証環境

  • 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/
    

    classes.png

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

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

    classes.png

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

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

    classes_AS.png

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

最後に

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

参考にしたサイト

kenichi-hamaguchi
最近はpythonが多い。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした