How to properly subclass dict and override __getitem__ & __setitem__

dictionary, inheritance, python, subclass

Solution

What you're doing should absolutely work. I tested out your class, and aside from a missing opening parenthesis in your log statements, it works just fine. There are only two things I can think of. First, is the output of your log statement set correctly? You might need to put a `logging.basicConfig(level=logging.DEBUG)` at the top of your script.

Second, `__getitem__` and `__setitem__` are only called during `[]` accesses. So make sure you only access `DictWatch` via `d[key]`, rather than `d.get()` and `d.set()`

Problem

I am debugging some code and I want to find out when a particular dictionary is accessed. Well, it's actually a class that subclasses `dict` and implements a couple extra features. Anyway, what I would like to do is subclass `dict` myself and override `__getitem__` and `__setitem__` to produce some debugging output. Right now, I have ``` class DictWatch(dict): def __init__(self, *args): dict.__init__(self, args) def __getitem__(self, key): val = dict.__getitem__(self, key) log.info("GET %s['%s'] = %s" % str(dict.get(self, 'name_label')), str(key), str(val))) return val def __setitem__(self, key, val): log.info("SET %s['%s'] = %s" % str(dict.get(self, 'name_label')), str(key), str(val))) dict.__setitem__(self, key, val) ``` `'name_label'` is a key which will eventually be set that I want to use to identify the output. I have then changed the class I am instrumenting to subclass `DictWatch` instead of `dict` and changed the call to the superconstructor. Still, nothing seems to be happening. I thought I was being clever, but I wonder if I should be going a different direction.

Original source