跃然一笑
def _sub_getitem(self, k): try: # sub.__class__.__bases__[0] real_val = self.__class__.mro()[-2].__getitem__(self, k) val = '' if real_val is None else real_val except Exception: val = '' real_val = None # isinstance(Avoid,dict)也是true,会一直递归死 if type(val) in (dict, list, str, tuple): val = type('Avoid', (type(val),), {'__getitem__': _sub_getitem, 'pop': _sub_pop})(val) # 重新赋值当前字典键为返回值,当对其赋值时可回溯 if all([real_val is not None, isinstance(self, (dict, list)), type(k) is not slice]): self[k] = val return valdef _sub_pop(self, k=-1): try: val = self.__class__.mro()[-2].pop(self, k) val = '' if val is None else val except Exception: val = '' if type(val) in (dict, list, str, tuple): val = type('Avoid', (type(val),), {'__getitem__': _sub_getitem, 'pop': _sub_pop})(val) return valclass DefaultDict(dict): def __getitem__(self, k): return _sub_getitem(self, k) def pop(self, k): return _sub_pop(self, k)In[8]: d=DefaultDict({'balabala':"dddddd"})In[9]: d['a']['b']['c']['d']Out[9]: ''In[10]: d['a']="ggggggg"In[11]: d['a']Out[11]: 'ggggggg'In[12]: d['a']['pp']Out[12]: ''再次没有错误。无论嵌套多少层。弹出没有错误也可以根据需要更改为任何值。