views:

59

answers:

1

I need magic tool, that helps me to understand where one my problem variable is changed in the code.

I know about perfect tool:

pdb.set_trace()

and I need something similar format, but about only one variable changing history.

For example, my current problem is strange value of context['request'] variable inside Django's tag template definition method. The value is string '<<request>>' and I don't understand where it modified from Django's Request object. I can't debug it, because problem is appearing not so often, but permanently. I only see it in error emails and I can't call it specially. The perfect solution will be to create a log with variable's assignment and any modifications.

+2  A: 

I'm not really familiar with django, so your mileage may vary. In general, you can override the __setitem__ method on objects to capture item assignment. However, this doesn't work on dictionaries, only on user-created classes, so first of all it depends on what this context object is.

As I get from a short look at the Django docs, it's indeed not a regular dict, so you can try something like this:

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

Even if this works, it of course only works if the assignment actually happens through the "standard" way, i.e. somewhere in the code there's a call like context['request'] = "something".

Might be worth a try, but I can't promise you anything.

balpha
Thanks! Good idea, I try to do this and tell here about results
ramusus