<filename>recipes/Python/576913_subclass_defaultdict_tell_defaultfactory_which/recipe-576913.py
from collections import defaultdict
from itertools import count


class Var(object):

    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return "Var(%s)" % self.name


class vardict(defaultdict):

    def __init__(self, *args, **kwargs):
        super(vardict, self).__init__(Var, *args, **kwargs)

    def __missing__(self, key, unique=count()):
        if self.default_factory is None:
            raise KeyError(key)
        if key == "_":
            return self.default_factory(key + str(next(unique)))
        self[key] = value = self.default_factory(key)
        return value


if __name__ == "__main__":

    vdict = vardict()
    vlist = []

    vlist.append(vdict["First"])
    vlist.append(vdict["Second"])
    vlist.append(vdict["_"])
    vlist.append(vdict["First"])
    vlist.append(vdict["Second"])
    vlist.append(vdict["_"])

    vlist.sort()

    print
    for key, value in vdict.items():
        print key, ":", value

    print
    for each in vlist:
        print id(each), ":", each

<filename>recipes/Python/576913_subclass_defaultdict_tell_defaultfactory_which/recipe-576913.py
from collections import defaultdict
from itertools import count


class Var(object):

    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return "Var(%s)" % self.name


class vardict(defaultdict):

    def __init__(self, *args, **kwargs):
        super(vardict, self).__init__(Var, *args, **kwargs)

    def __missing__(self, key, unique=count()):
        if self.default_factory is None:
            raise KeyError(key)
        if key == "_":
            return self.default_factory(key + str(next(unique)))
        self[key] = value = self.default_factory(key)
        return value


if __name__ == "__main__":

    vdict = vardict()
    vlist = []

    vlist.append(vdict["First"])
    vlist.append(vdict["Second"])
    vlist.append(vdict["_"])
    vlist.append(vdict["First"])
    vlist.append(vdict["Second"])
    vlist.append(vdict["_"])

    vlist.sort()

    print
    for key, value in vdict.items():
        print key, ":", value

    print
    for each in vlist:
        print id(each), ":", each
