我需要魔术工具,这有助于我了解代码中我的问题变量的位置。
我知道完美的工具:
pdb.set_trace()
我需要类似的格式,但只有一个变量可以改变历史记录。
例如,我当前的问题是Django的标签模板定义方法中context['request']
变量的奇怪值。值是字符串'<<request>>'
,我不明白它从Django的Request对象修改的位置。我无法调试它,因为问题不是经常出现,而是永久出现。我只在错误的电子邮件中看到它,我不能特意调用它。完美的解决方案是创建一个包含变量赋值和任何修改的日志。
答案 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"
之类的调用。
可能值得一试,但我不能向你许诺。