我們先來看下效果圖:
#怎麼樣,很是驚艷吧~
#下面我們就來一起完成這個視覺化過程。
產生圖片的過程,是依賴工具 graphviz 的,我們先進行下載安裝。
下載網址
接下來我們還需要安裝兩個Python 依賴函式庫。
pip install pycallgraph
下面我們先寫一個基礎的程式碼;
from pycallgraph import PyCallGraph from pycallgraph.output import GraphvizOutput class Banana: def eat(self): pass class Person: def __init__(self): self.no_bananas() def no_bananas(self): self.bananas = [] def add_banana(self, banana): self.bananas.append(banana) def eat_bananas(self): [banana.eat() for banana in self.bananas] self.no_bananas() def main(): graphviz = GraphvizOutput() graphviz.output_file = 'basic.png' with PyCallGraph(output=graphviz): person = Person() for a in range(10): person.add_banana(Banana()) person.eat_bananas() if __name__ == '__main__': main()
程式碼比較簡單,定義了兩個簡單類,主要pycallgraph 的核心程式碼在main 函數中,在with 程式碼區塊下,把我們定義的程式碼執行一遍即可
運行上面的程式碼,會在目前目錄下產生basic.png 圖片檔
從產生的圖片可以非常清楚的看出整個程式碼的運行過程,從main 程式碼區塊到各個類別的初始化,可以說一目了然。
我們再來一個複雜一點的例子:
import re from pycallgraph import PyCallGraph from pycallgraph import Config from pycallgraph.output import GraphvizOutput def main(): graphviz = GraphvizOutput() graphviz.output_file = 'regexp.png' config = Config(include_stdlib=True) with PyCallGraph(output=graphviz, config=config): reo = compile() match(reo) def compile(): return re.compile('^[abetors]*$') def match(reo): [reo.match(a) for a in words()] def words(): return [ 'abbreviation', 'abbreviations', 'abettor', 'abettors', 'abilities', 'ability', 'abrasion', 'abrasions', 'abrasive', 'abrasives', ] if __name__ == '__main__': main()
程式碼同樣不負責,不過在編譯器內部是呼叫了re 正則的,我們來看看最終生成的圖片:
可以看到整個程式碼過程複雜了很多,因為內部呼叫了很多正規內部函數等,但是整體還是非常清晰的
可以說這個神級第三方庫,絕對是眾多Python 愛好者,尤其是剛剛入門Python 領域的朋友的福音,當我們遇到某些不熟悉的較為複雜的程式碼塊時,不妨使用該庫來嘗試一下可視化,看看能不能從中爆發靈感呢~
以上是神器,輕鬆視覺化 Python 程式呼叫流程的詳細內容。更多資訊請關注PHP中文網其他相關文章!