This isn't a general solution but roughly works for your example:
class DynamicDict(dict):
def __getitem__(self, key):
value = super(DynamicDict, self).__getitem__(key)
return eval(value, self) if isinstance(value, str) else value
>>> d = DynamicDict(key1=3, key2=5, key3='key1+key2')
>>> d.update({'key2': 6})
>>> d['key3']
9