dynamicdict is a Python dict-like class that mirrors the functionality of defaultdict in the collections library
of the Python standard library. Similar to defaultdict, dynamicdict calls a default_factory function
(or any other callable) when one attempts to access a value for which the key does not exist in the dictionary.
dynamicdict, however, passes the missing key to this function. Thus the values for missing keys are created
dynamically based on the value of the key itself.
>>> from dynamicdict import dynamicdict
>>> my_dyd = dynamicdict(str.upper)
>>> my_dyd['hello'] += ' world'
'HELLO world'
>>> class Person:
... def __init__(self, name, age=0):
... self.name = name
... self.age = age
... def have_birthday(self):
... self.age += 1
... print(f"{self.name} has turned {self.age}")
>>> people_dyd = dynamicdict(Person)
>>> people_dyd['Bob'] = Person('Bob', 42)
>>> for friend in ['Bob', 'Alice']:
... people_dyd[friend].have_birthday()
'Bob has turned 43'
'Alice has turned 1'Callables that require more than one positional argument or keyword arguments can be created with lambdas, provided that all other arguments can be constants or themselves functions of the missing key.
>>> dyd = dynamicdict(lambda x: Person(x, 10))
>>> dyd['Carl'].have_birthday()
'Carl has turned 11'Instantiating a dynamicdict with a callable that requires more than one argument will raise
TypeError when one attempts to access a missing key.
>>> dyd = dynamicdict(lambda x, y: x + y)
>>> dyd[2] += 3
TypeError: <lambda>() missing 1 required positional argument: 'y'This class is implemented in C, though it is equivalent to the following pure Python code:
from collections import defaultdict
class dynamicdict(defaultdict):
def __missing__(self, key):
new_val = self[key] = self.default_factory(key)
return new_valThis module can be installed from github
pip install git+https://github.com/swfarnsworth/dynamicdict.gitNote that GCC is required to compile this module, but the compilation is handled automatically.