|
|
import collections |
|
|
|
|
|
|
|
|
|
|
|
class FreezableDefaultDict(collections.defaultdict): |
|
|
""" |
|
|
Often it is desirable to prevent the mutation of |
|
|
a default dict after its initial construction, such |
|
|
as to prevent mutation during iteration. |
|
|
|
|
|
>>> dd = FreezableDefaultDict(list) |
|
|
>>> dd[0].append('1') |
|
|
>>> dd.freeze() |
|
|
>>> dd[1] |
|
|
[] |
|
|
>>> len(dd) |
|
|
1 |
|
|
""" |
|
|
|
|
|
def __missing__(self, key): |
|
|
return getattr(self, '_frozen', super().__missing__)(key) |
|
|
|
|
|
def freeze(self): |
|
|
self._frozen = lambda key: self.default_factory() |
|
|
|
|
|
|
|
|
class Pair(collections.namedtuple('Pair', 'name value')): |
|
|
@classmethod |
|
|
def parse(cls, text): |
|
|
return cls(*map(str.strip, text.split("=", 1))) |
|
|
|