2009-12-29 98 views
0

我需要一個神奇的工具,它可以幫助我理解代碼中我的問題變量的變化。python中變量的調試歷史

我知道完美工具:

pdb.set_trace() 

,我需要的東西類似的格式,而是隻有一個變量變化的歷史。

例如,我目前的問題是Django的標籤模板定義方法中的context['request']變量的奇怪值。值爲字符串'<<request>>',我不明白它從Django的Request對象修改的位置。我無法調試它,因爲問題不是經常出現,而是永久性出現。我只看到它在錯誤的電子郵件中,我不能專門調用它。完美的解決方案將是創建一個包含變量賦值和任何修改的日誌。

+0

明顯的解決方案是重載賦值操作(變量=值)。然而,我認爲它不可能超載分配:( – Kimvais 2009-12-29 15:01:05

+0

你不能修改請求對象,看看你的urls.py,看看爲什麼你的視圖函數被調用。「除了會話的所有屬性應該被認爲是隻讀的「你正在做錯誤的事情來調試你的問題 – 2009-12-29 15:23:30

+2

另外....關閉這個問題並詢問你的*真實問題 – 2009-12-29 15:24:33

回答

2

我對django並不熟悉,所以你的里程可能會有所不同。通常,您可以覆蓋對象的__setitem__方法來捕獲項目分配。但是,這不適用於字典,只適用於用戶創建的類,因此首先取決於這個對象是什麼。

正如我從Django文檔短期看獲得,這的確不是一個普通字典,所以你可以嘗試這樣的事:

def log_setitem(obj): 
    class Logged(obj.__class__): 
     def __setitem__(self, item, val): 
       print "setting", item, "to", val, "on", self 
       super(Logged, self).__setitem__(item, val) 

    obj.__class__ = Logged 

d = {} 
try: 
    log_setitem(d) # throws an error 
except: 
    print "doesn't work" 

class Dict2(dict): 
    pass 

d2 = Dict2() 
log_setitem(d2) # this works 

d2["hello"] = "world" # prints the log message before assigning 

即使這個工作,它當然只能當實際上通過「標準」方式進行分配,即在代碼中的某個地方有一個像context['request'] = "something"那樣的呼叫。

可能值得一試,但我不能向你承諾任何事情。