2012-12-13 64 views
7

我想要構建一個可視化調試器,它可以幫助編程學生了解如何進行表達式評估(子表達式如何通過它們的值進行評估和「替換」,例如Excel中的表達式評估可視化器)。如何通過Python表達式評估過程?

看起來您無法通過Python的pdb逐步完成此過程,因爲其最好的步驟粒度是代碼行。是否有可能通過Python字節碼?任何其他想法如何實現這一目標?

編輯:我需要一個輕量級的解決方案,可以建立在CPython標準庫之上。

+0

不會像pythons c級調試器[gdb](http://wiki.python。組織/莫恩/ DebuggingWithGdb)? – 2012-12-13 14:21:53

+0

@ X.Jacobs - 我需要一個可以構建在CPython默認發行版上的解決方案,它可以在Windows以及OSX和Linux中運行。 – Aivar

+0

[使用GDB 7的新Python擴展支持調試C/C++和CPython](http://misspent.wordpress.com/2012/03/24/debugging-cc-and-cpython-using-gdb-7s-new -python-extension-support /) – 2012-12-13 14:33:09

回答

1

我有一個解決方案的想法也是我自己 - 我可以儀器通過包裝的所有(子)代碼(或AST)的表達式虛擬方法調用,它只是返回它的參數。例如。

x = f(sin(x + y)) 

成爲

x = dummy(f(dummy(sin(dummy(dummy(x) + dummy(y)))))) 

這樣,我保證通知各子表達式後得到評估,我也得到了值。我還可以添加額外的位置/ AST有關其表達的一部分目前正在處理,如:

... dummy(x, line=23, col=13, length=1) ... 

不幸的是,這需要與AST和編譯搞亂......

+0

嗨!看來我正在解決同樣的問題,你可以請你看看[我的問題](http://stackoverflow.com/questions/40639652/tracing-python-expression-evaluation-step-by-步)。有一個賞金開放。看來我正在尋找你在這裏描述的一部分代碼。我可以嘗試深入瞭解Thonny軟件的代碼(因爲我想與Jupyter進行互操作,並且我不想要完整的調試器,我目前不想使用Thonny),但我相信你會做得更好:) –

+0

@ IlyaV.Schurov,相關的代碼在這裏https://bitbucket.org/plas/thonny/src/master/thonny/backend.py?at=master&fileviewer=file-view-default,也許你可以從那裏重用一些東西。您可能還需要https://bitbucket.org/plas/thonny/src/master/thonny/ast_utils.py?at=master&fileviewer=file-view-default,因爲Python AST沒有包含足夠(正確)的關於每個位置的信息AST節點位於代碼中。 – Aivar

+0

謝謝!你可以請你的答案複製到[我的問題](http://stackoverflow.com/questions/40639652/tracing-python-expression-evaluation-step-by-step)讓我把它看作是一個可能的賞金贏家? –

1

使用pdb,可以進入任何函數調用。對於任何其他語句,pdb可以在行中打印相關名稱的值。您尋找的其他功能沒有涵蓋?

如果您想要「進入」像列表理解這樣的事情,那麼從純粹的Python角度來看,它將無法工作,因爲它只是一個操作碼。在每個表達式的某個時刻,你需要告訴你的學生,這就是Python進入C實現並評估它的地方......'。

+0

問題是當一條線上有多個函數調用時。如果我在這條線上選擇「step」命令,那麼我會發現自己處於這些功能之一,並且不清楚哪一個。如果Python步入所有函數,那麼我可以提前解析表達式,以查明函數調用以哪種順序進行評估。這將幫助我保持目前正在評估的子表達式的軌跡。但不幸的是,Python不會進入內建/ C函數,而且語法上這些函數調用與用戶定義函數的調用是無法區分的。 – Aivar

+0

只要你按住's',它就會進入所有功能。而你的抱怨'Python不會進入內置/ C函數'正是我的觀點:在某個時刻,你進入C並需要一種方式來處理這個問題。這可能是gdb或其他東西,但它會一直髮生。 – jknupp

+0

我不想步入C函數,我只想知道我在原始表達式中的位置,但是Python不會告訴我這些(請參閱我的其他問題:http://stackoverflow.com/questions/ 13952022 /)。我可以統計函數條目的數量並自己跟蹤位置,但有些函數調用(未知數)會被跟蹤器忽略,這就打破了我的計數系統。 – Aivar

1

你應該看看reinteract,這是很簡單的,你可以有助於該

2

你試過pudb? http://pypi.python.org/pypi/pudb 在Debian樣: apt-get的安裝python-pudb

它依附於PDB,所以我想這是不是你要找的東西。至少,當你在一個函數步驟,清楚地顯現你是哪一個

教學生的東西,你可能可以。

  • 首先,使用變量編寫程序,作曲使用幾個步驟,
  • 使用任何體面的python調試器(pdb,winpdb,pudb ...),
  • 調試此程序然後,一旦過程得到很好的理解,通過將代碼組合成更少線,逐漸,直到你來到最後的代碼。

我知道,這是完美的,但這是目前我能想到的最好的。