watching mutables?

Anton Vredegoor anton at vredegoor.doge.nl
Mon Sep 30 12:48:03 EDT 2002


On 30 Sep 2002 01:05:17 GMT, bokr at oz.net (Bengt Richter) wrote:

<good explanation deleted>

I have slightly adjusted your code to result in the code below, this
works if imported by Idle like this:

Python 2.2 (#28, Dec 21 2001, 12:21:22) [MSC 32 bit (Intel)] on win32
Type "copyright", "credits" or "license" for more information.
IDLE 0.8 -- press F1 for help
>>> from watcher import Watcher
>>> w = Watcher('m',locals())
>>> m = 1
"m" is bound to new object: 1


So this seems to be ok. However if the script below is executed
itself, nothing happens. Also importing the module in another script
and then executing a test script gives no output. The watch function
isn't called at all. I guess the tracer has to know more about the
other arguments in:

    def watch(self, frame, event, arg):

Could this please be elucidated.

Thanks for your insightful remarks and code.

Anton.


#watcher.py
from sys import settrace, modules
from marshal import dumps

class Watcher:

    def __init__(self, name, namespace):
            self.name = name
            self.ns = namespace
            obj = namespace.get(name)
            self.objid = id(obj)
            self.objs = dumps(obj)
            settrace(self.watch)

    def watch(self, frame, event, arg):
            obj = self.ns.get(self.name)
            objid = id(obj)
            if objid != self.objid:
                self.objid = objid
                what = 'new'
            else:
                what = 'same but mutated'
            objs = dumps(obj)
            if self.objs != objs:
                print '"%s" is bound to %s object: %s' % (self.name,
what, `obj`)
                self.objs = objs
            elif what == 'new':
                what = 'new but equivalent'
                print '"%s" is bound to %s object: %s' % (self.name,
what, `obj`)
            return self.watch

    def finished(self):
            settrace(None)

def test():
    # huh ?
    w = Watcher('m', locals())
    m = 1

if __name__=='__main__':
    test()




More information about the Python-list mailing list