zoukankan      html  css  js  c++  java
  • AutoDict与AutoOrderedDict

    class DotDict(dict):
        # If the attribut is not found in the usual places try the dict itself
        def __getattr__(self, key):
            if key.startswith('__'):
                return super(DotDict, self).__getattr__(key)
            return self[key]
    
    
    class AutoDict(dict):
        _closed = False
    
        def _close(self):
            self._closed = True
            for key, val in self.items():
                if isinstance(val, (AutoDict, AutoOrderedDict)):
                    val._close()
    
        def _open(self):
            self._closed = False
    
        def __missing__(self, key):
            if self._closed:
                raise KeyError
    
            value = self[key] = AutoDict()
            return value
    
        def __getattr__(self, key):
            if False and key.startswith('_'):
                raise AttributeError
    
            return self[key]
    
        def __setattr__(self, key, value):
            if False and key.startswith('_'):
                self.__dict__[key] = value
                return
    
            self[key] = value
    
    
    class AutoOrderedDict(OrderedDict):
        _closed = False
    
        def _close(self):
            self._closed = True
            for key, val in self.items():
                if isinstance(val, (AutoDict, AutoOrderedDict)):
                    val._close()
    
        def _open(self):
            self._closed = False
    
        def __missing__(self, key):
            if self._closed:
                raise KeyError
    
            # value = self[key] = type(self)()
            value = self[key] = AutoOrderedDict()
            return value
    
        def __getattr__(self, key):
            if key.startswith('_'):
                raise AttributeError
    
            return self[key]
    
        def __setattr__(self, key, value):
            if key.startswith('_'):
                self.__dict__[key] = value
                return
    
            self[key] = value
    
        # Define math operations
        def __iadd__(self, other):
            if type(self) != type(other):
                return type(other)() + other
    
            return self + other
    
        def __isub__(self, other):
            if type(self) != type(other):
                return type(other)() - other
    
            return self - other
    
        def __imul__(self, other):
            if type(self) != type(other):
                return type(other)() * other
    
            return self + other
    
        def __idiv__(self, other):
            if type(self) != type(other):
                return type(other)() // other
    
            return self + other
    
        def __itruediv__(self, other):
            if type(self) != type(other):
                return type(other)() / other
    
            return self + other
    
        def lvalues(self):
            return py3lvalues(self)
    

      

  • 相关阅读:
    12/18随笔周记
    12/11博客
    12/5周期
    页面管理———页边距
    页面管理
    开发周记
    Echarts图表在VUE项目中使用动态数据源
    VUE.js项目中控制台报错: Uncaught (in promise) NavigationDuplicated解决方法
    Maven工程中web项目提示The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path错误
    Java运算符(i++与++i)
  • 原文地址:https://www.cnblogs.com/sidianok/p/13920189.html
Copyright © 2011-2022 走看看