我正在嘗試編寫Python表達式評估可視化器,它將顯示如何逐步評估Python表達式(用於教育目的)。 Philip Guo的Python Tutor非常棒,但它逐行評估Python程序,並且我發現學生有時不明白如何評估單行表達式sorted([4, 2, 3, 1] + [5, 6])[1] == 2
,並且想要將此過程可視化。 (似乎沒有人去做,但 - 至少我什麼也沒發現。)理想的解決方案將創建的字符串這樣的順序:逐步跟蹤Python表達式評估
sorted([4, 2, 3, 1] + [5, 6])[1] == 2
sorted(>> [4, 2, 3, 1] + [5, 6] <<)[1] == 2
>> sorted([4, 2, 3, 1, 5, 6]) << [1] == 2
>> [1 2 3 4 5 6][1] << == 2
>> 2 == 2 <<
True
這裏>>
和<<
被用來強調的是表達的一部分評估當前步驟,然後用其值替換。 (也許,我會稍後再嘗試這個序列轉換爲某種動畫。)
我目前的策略是使用ast.parse()
解析字符串轉換成AST,然後發現,將首先評估一個節點,eval(compile(node, '', 'eval'))
對其進行評估(我絕對不希望重新實現整個Python :)),將評估結果轉換爲AST節點(使用repr
,然後使用ast.parse()
?),並將結果節點替換爲當前節點,然後使用codegen.to_source
生成修改後的代碼字符串從(修改)AST並繼續相同的過程,直到我在樹中只有一個文字。
我的問題是:我如何找到一個將首先評估的節點?似乎我可以深入遍歷樹的子類ast.NodeVisitor
,但我不確定如何檢測到我到達了所需的節點,並且如何在它之後停止遍歷?
編輯。
有可能我的初始方法與樹的轉換不可行。實際上,評估Python表達式的基本步驟並不是必須的,它必須將某個子表達式替換爲更簡單的子表達式(如在算術中)。例如,列表解析提供了一個非常複雜的行爲,不能用來代替這個東西,然後遞歸地重複。所以我重申一個問題。我需要一些編程方法來展示如何逐步評估Python表達式。例如,@ jasonharper提到的MacroPy的tracing功能在此階段是可接受的解決方案。不幸的是,MacroPy似乎被拋棄了,並且不適用於Python 3.是否有任何想法如何在不移植完整MacroPy的情況下類似於Python 3中的跟蹤行爲?
EDIT2。
就在我獲得這個獎勵後,我發現similar question和debugger與非常接近的功能。然而,由於這個問題沒有最終答案,而且我也不需要完整的調試器,所以我仍然在尋找一個可以在Jupyter環境中使用的答案。
Hm-m,'macropy''s [tracing](https://github.com/lihaoyi/macropy#tracing)看起來非常接近,很有前途,謝謝。我必須深入研究它。 –
唉,'macropy'不適用於Python 3 :( –