python中变量更改的调试历史记录
我需要一个神奇的工具,它可以帮助我理解我的问题变量在代码中的变化 我了解完美工具:python中变量更改的调试历史记录,python,django,debugging,Python,Django,Debugging,我需要一个神奇的工具,它可以帮助我理解我的问题变量在代码中的变化 我了解完美工具: pdb.set_trace() 我需要类似的格式,但只有一个变量改变历史 例如,我当前的问题是Django的标记模板定义方法中context['request']变量的奇怪值。这个值是string“”,我不知道它是从Django的请求对象修改的。我无法调试它,因为问题不是经常出现,而是永久性地出现。我只在错误的电子邮件中看到它,我不能特别称呼它。完美的解决方案是创建一个包含变量赋值和任何修改的日志。我对djan
pdb.set_trace()
我需要类似的格式,但只有一个变量改变历史
例如,我当前的问题是Django的标记模板定义方法中
context['request']
变量的奇怪值。这个值是string“”
,我不知道它是从Django的请求对象修改的。我无法调试它,因为问题不是经常出现,而是永久性地出现。我只在错误的电子邮件中看到它,我不能特别称呼它。完美的解决方案是创建一个包含变量赋值和任何修改的日志。我对django不太熟悉,因此您的里程可能会有所不同。通常,您可以覆盖对象上的\uuuuu setitem\uuuu
方法以捕获项目分配。然而,这不适用于字典,只适用于用户创建的类,因此首先它取决于这个上下文对象是什么
我从Django文档中了解到,它确实不是一个常规的dict,因此您可以尝试以下内容:
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”
可能值得一试,但我不能向您保证任何事情。显而易见的解决方案是重载赋值操作(变量=值)。但是,我认为不可能重载赋值:(您不能修改请求对象。请查看URL.py以了解调用视图函数的原因。“除会话外的所有属性都应视为只读。”你在调试你的问题时做了错误的事情。另外……结束这个问题,问你真正的问题。实际上,这个问题本身就是一个有趣而有用的问题,即使它不是@ramusus真正应该问的问题。