dictionary wart

Skip Montanaro skip at pobox.com
Thu Mar 18 16:15:58 CET 2004

    Jesper> For instance in a dictionary which is mapping strings to
    Jesper> integers (or lists), I would like to do

    Jesper> a[my_key]+=5

    Jesper> expressing that with get() would be awkward.

Though not *terribly* awkward:

    a[my_key] = a.get(my_key, 0) + 5

I agree it's a bit clumsy, but I think it's the best you can do if you don't
want to subclass dict (I don't really like {}.setdefault()):

    class ddict(dict):
        def __init__(self, default=None, init=True):
            self.default = default
            self.init = init

        def __getitem__(self, key):
            if key in self:
                return self.get(key)
                if self.init:
                    self[key] = self.default
                return self.default

    d = ddict(default="Jesper", init=False)
    print "abc" in d
    print d["abc"]
    d = ddict(default=0)
    d["abc"] += 5
    print d["abc"]

I suspect there's more to it than I've implemented, but that should get you
pointed in the right direction.


More information about the Python-list mailing list