How do I make a defaultdict safe for unexpecting clients?

后端 未结 5 2154
情话喂你
情话喂你 2021-01-05 15:00

Several times (even several in a row) I\'ve been bitten by the defaultdict bug: forgetting that something is actually a defaultdict and treating it like a regular dictionary

5条回答
  •  被撕碎了的回忆
    2021-01-05 15:09

    Using rkhayrov's idea of resetting self.default_factory, here is a toggleable subclass of defaultdict:

    class ToggleableDefaultdict(collections.defaultdict):
        def __init__(self,default_factory):
            self._default_factory=default_factory
            super(ToggleableDefaultdict,self).__init__(default_factory)
        def off(self):
            self.default_factory=None
        def on(self):
            self.default_factory=self._default_factory
    

    For example:

    d=ToggleableDefaultdict(list)
    d['key'].append(1)
    print(d)
    # defaultdict(, {'key': [1]})
    
    d.off()
    d['newkey'].append(2)
    # KeyError: 'newkey'
    
    d.on()
    d['newkey'].append(2)
    # defaultdict(, {'newkey': [2], 'key': [1]})
    

提交回复
热议问题