Resolve cycle # 之前用 astroid 寫的 tool pydependency , 將 dependency graph 匯出成 .dot 或是一些 .json 格式後, 就有幾個方便的 tool 可以來分析了。 以下的故事基本上都是在分析 junyi-academy 的 code,但大部分的壞味道,從 khan-academy 時代就有了。如果只看 dependency graph 沒感覺的話,也可以載 source code 來看看。 graph tools # graphviz # graphviz 為老牌的 graph 視覺化工具。 pylint 的內含的工具 pyreverse 就是拿 graphviz 來畫 UML 的圖的。好處就是簡單好上手,畫出第一張圖: echo "digraph { hello->world }" | dot -Tpng -o dot.png 強大之處在於其 layout 演算法,但是如果 cycle 很多,畫出來就會全部結成一團, 也不知道能怎麼調整。 python 部分套件可以安裝 pygraphviz 或 pydot,讀寫 dot 會方便些。 pygraphviz 包裝原生 graphviz library 的 C api 到 python 中,所以對於 agraph 的操作是直接對應到 C 的 data structure 的。 而 pydot 對於 graph 的操作都還是在 python 當中。直到要找 graphviz tool 時, 才利用其中的 parser 作資料的轉換。 兩個在 layout/draw 時,都還是直接用 subprocess.Popen 呼叫 graphviz 的 command line tools。pygraphviz 也沒有因為直接呼叫 C,而直接用像 gvToolTred 這樣的 function。還是多了一層 serialize、deserialize 及 pipe。 在 tred 或是 layout (只需要多標上 position?) 這樣的功能上,感覺滿慘的。 tred 是一個 grap...