python中变量变化的调试历史

时间:2009-12-29 14:47:05

标签: python django debugging

我需要魔术工具,这有助于我了解代码中我的问题变量的位置。

我知道完美的工具:

pdb.set_trace()

我需要类似的格式,但只有一个变量可以改变历史记录。

例如,我当前的问题是Django的标签模板定义方法中context['request']变量的奇怪值。值是字符串'<<request>>',我不明白它从Django的Request对象修改的位置。我无法调试它,因为问题不是经常出现,而是永久出现。我只在错误的电子邮件中看到它,我不能特意调用它。完美的解决方案是创建一个包含变量赋值和任何修改的日志。

1 个答案:

答案 0 :(得分:2)

我对django并不熟悉,所以你的里程可能会有所不同。通常,您可以覆盖对象上的__setitem__方法以捕获项目分配。但是,这不适用于字典,仅适用于用户创建的类,因此首先取决于此context对象是什么。

当我从简短的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"之类的调用。

可能值得一试,但我不能向你许诺。