Recursively access dict via attributes as well as index access?

前端 未结 5 1506
隐瞒了意图╮
隐瞒了意图╮ 2020-12-02 06:36

I\'d like to be able to do something like this:

from dotDict import dotdictify

life = {\'bigBang\':
           {\'stars\':
               {\'planets\': []}
         


        
5条回答
  •  醉酒成梦
    2020-12-02 07:03

    #!/usr/bin/env python3
    # _*_ coding: utf-8 _*_
    
    # Author: Xingbang Jiang
    # E-mail: 1278561590@qq.com
    # HomePage: http://www.xingbangsharing.tech
    
    class Dotsdict(dict):
        def __init__(self, args, **kwargs):
            super(Dotsdict, self).__init__(args, **kwargs)
            for obj in [args, kwargs]:
                for k, v in obj.items():
                    if isinstance(v, dict):
                        v = Dotsdict(v)
                    self.__setitem__(k, v)
    
        def __setitem__(self, key, val):
            super(Dotsdict, self).__setitem__(key, val)
            # self.__dict__[key] = val
    
        def __delitem__(self, key):
            super(Dotsdict, self).__delitem__(key)
            # del self.__dict__[key]
    
        def __getitem__(self, key):
            return super(Dotsdict, self).__getitem__(key)
    
        def __missing__(self, key):
            dots = Dotsdict()
            self.__setitem__(key, dots)
            return dots
    
        __setattr__, __delattr__, __getattr__ = __setitem__, __delitem__, __getitem__
    
    # ===================================================================
    
    
    d = {'k': 'v', 'x': {'y': 'z', 'p': 'q', }, }
    print(type(d))
    print(d)
    
    dd = Dotsdict(d, i='j')
    print(type(dd))
    print(dd)
    
    print('========================================')
    
    dd.a = 'b'
    dd.x.m = 'n'
    print(dd.x.y)
    
    del dd.x['p']
    print(dd)
    print(len(dd))
    

提交回复
热议问题