bendersalt
bendersalt

Reputation: 3

A Default Dict that default's to a dictionary with pre-generated keys

If there a better way to accomplish this?

from functool import partial
from collections import defaultdict

dict_factory = partial(dict, {'flag_name' : False,
                              'flag_name2' : False,
                              'flag_name3' : True, etc.}

self.ids_with_flags_dictionary = defaultdict(dict_factory)

The goal here being a dictionary of keys(the keys being id's of some kind) that autogenerates the list of default flag states if I call an ID that hasn't been called before.

Upvotes: 0

Views: 148

Answers (2)

unutbu
unutbu

Reputation: 879113

You could use a lambda with dict.fromkeys:

In [15]: x = collections.defaultdict(
             lambda: dict.fromkeys(
                 ['flag_name', 'flag_name2', 'flag_name3'], False))

In [16]: x['foo']
Out[16]: {'flag_name': False, 'flag_name2': False, 'flag_name3': False}

Or, to accommodate arbitrary dicts, just return the dict from the lambda:

In [17]: x = collections.defaultdict(lambda: {'flag_name': False, 'flag_name2': False, 'flag_name3': False})

In [18]: x['foo']
Out[18]: {'flag_name': False, 'flag_name2': False, 'flag_name3': False}

Upvotes: 0

BrenBarn
BrenBarn

Reputation: 251365

There's nothing wrong with it exactly, but using partial seems a bit overkill just to return a static value. Why not just:

defaultFlags = {'flag_name' : False,
'flag_name2' : False,
'flag_name3' : False,
# etc.
}

self.ids_with_flags_dictionary = defaultdict(lambda: defaultFlags.copy())

Upvotes: 2

Related Questions