Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中变量更改的调试历史记录_Python_Django_Debugging - Fatal编程技术网

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真正应该问的问题。