2009-12-29 96 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"那样的呼叫。

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