You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
31 lines
743 B
Python
31 lines
743 B
Python
2 years ago
|
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')):
|
||
|
@classmethod
|
||
|
def parse(cls, text):
|
||
|
return cls(*map(str.strip, text.split("=", 1)))
|