簡體   English   中英

在調試器中更改 Python 代碼

[英]changing Python code in the debugger

是否有任何調試器允許在調試時更改 Python 代碼?

換句話說:運行時異常發生,調試器停止,我以任何我喜歡的方式更改代碼,並告訴程序繼續。

我知道這種方法的問題,如果我動態重新定義函數,對函數的引用仍然指向舊定義,依此類推。 我對此沒有意見,因為我只想能夠在非常簡單的情況下進行小的修復。

另一方面,我也對理論上是否可以允許更改 Python 代碼而不會遇到這些問題感興趣:即,以某種方式更新對已更改對象的所有引用等。我幾乎可以肯定答案是第二個問題是否定的,但如果我錯了,我想知道。

編輯:如果我的目標(在發生異常時以交互方式更改代碼,然后繼續執行)可以在沒有調試器的情況下實現 - 那也很好。 我不需要使用調試器。

由於您可以隨時以您想要的方式更改常規類的內容,因此無需更新對對象的引用:您只需使用新方法和其他屬性更新類的__dict__

問題在於對函數的引用:您無法在不更改函數標識的情況下更新函數。 您可以使用始終按名稱查找實際函數的代理函數,並且您可以隨時更改實際函數。 否則,您計划您的代碼,使其不會長時間存儲函數引用; 一旦一個函數被更新,它很快就會被名稱查找,但是在某處傳遞的舊引用將繼續執行一段時間。

當您希望在不嚴重停機的情況下升級系統時,這種修補對於長期運行的系統是有意義的:您暫停它一會兒以一致地升級多個類和函數並取消暫停。 AFAIK Erlang 以類似的方式進行即時更新。

是的,pdb 可以做到這一點。 盡管您必須在另一個編輯器中進行編輯,並且更改將被忽略,直到您重新啟動。

但是由於您要做的只是小的更改,因此這不是問題。 但是你不能改變正在運行的代碼(除了重新加載,見下文),因為改變代碼意味着代碼和狀態不同步。

您可以使用調試器做的是測試您想要做的更改。 您可以根據需要粘貼代碼以進行更改,從而無需重新運行整個程序即可測試它是否正確。 但在這種情況下,您不要編輯文件。

(在某些特定情況下,您可能可以通過謹慎使用“reload()”來避免重新啟動,但這可能不值得付出努力。)

您可以使用 xreload 更新正在運行的 Python 進程中的代碼:

http://svn.python.org/projects/sandbox/trunk/xreload/xreload.py

有很多限制,它們列在文件的頂部。 我不確定這是否能處理你想要的情況 - 你真的想阻止異常傳播嗎? 這需要的不僅僅是更新正在運行的程序。

理論上是否可以允許更改 Python 代碼

是的。 可以“即時”更新代碼對象。 Python VM 中的任何內容似乎都無法阻止這一點。 沒有對校驗和或任何東西的持續驗證。

以某種方式更新對已更改對象的所有引用,

這甚至沒有意義。 一旦更改了類級方法定義,“更新”所有引用甚至沒有必要或明智。 代碼在唯一的地方發生了變化。

這就是調試器不好的原因。 它們似乎會導致模糊不清的想法。 對調試器考慮太多意味着對手頭的真正問題考慮太少。

TDD 是一項遠好得多的投資。 小型、易於管理的單元測試運行速度很快,並提供持久的證據證明事情有效。

http://en.wikipedia.org/wiki/Test-driven_development

name = (input("請輸入姓名:"))

if name == "e": print("這個詞有一個字母e")

else : print("這個詞沒有字母e")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM