Exposing `defaultdict` as a regular `dict` Exposing `defaultdict` as a regular `dict` python python

Exposing `defaultdict` as a regular `dict`


defaultdict docs say for default_factory:

If the default_factory attribute is None, this raises a KeyError exception with the key as argument.

What if you just set your defaultdict's default_factory to None? E.g.,

>>> d = defaultdict(int)>>> d['a'] += 1>>> ddefaultdict(<type 'int'>, {'a': 1})>>> d.default_factory = None>>> d['b'] += 2Traceback (most recent call last):  File "<stdin>", line 1, in <module>KeyError: 'b'>>> 

Not sure if this is the best approach, but seems to work.


Once you have finished populating your defaultdict, you can simply create a regular dict from it:

my_dict = dict(my_default_dict)

One can optionally use the typing.Final type annotation.

If the default dict is a recursive default dict, see this answer which uses a recursive solution.


You could make a class that holds a reference to your dict and prevent setitem()

from collections import Mappingclass MyDict(Mapping):    def __init__(self, d):        self.d = d;    def __getitem__(self, k):        return self.d[k]    def __iter__(self):        return self.__iter__()    def __setitem__(self, k, v):        if k not in self.d.keys():            raise KeyError        else:            self.d[k] = v