| import collections | |
| # from jaraco.collections 3.3 | |
| 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')): | |
| def parse(cls, text): | |
| return cls(*map(str.strip, text.split("=", 1))) | |