Python:通过属性递归访问dict以及索引访问? [英] Python: Recursively access dict via attributes as well as index access?

查看:215
本文介绍了Python:通过属性递归访问dict以及索引访问?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想要这样做:

from dotDict import dotdictify

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

dotdictify(life)

#this would be the regular way:
life['bigBang']['stars']['planets'] = {'earth': {'singleCellLife': {} }}
#But how can we make this work?
life.bigBang.stars.planets.earth = {'singleCellLife': {} }


#Also creating new child objects if none exist, using the following syntax

life.bigBang.stars.planets.earth.multiCellLife = {'reptiles':{},'mammals':{}}

我的动机是提高代码的简洁性,如果可能,使用类似JavaScript的语法来访问JSON对象,以实现高效的跨平台开发(我也使用Py2JS等)

My motivations are to improve the succinctness of the code, and if possible use similar syntax to Javascript for accessing JSON objects for efficient cross platform development.(I also use Py2JS and similar.)

推荐答案

以下是创建此类体验的一种方式:

Here's one way to create this kind of experience:

class dotdictify(dict):
    marker = object()
    def __init__(self, value=None):
        if value is None:
            pass
        elif isinstance(value, dict):
            for key in value:
                self.__setitem__(key, value[key])
        else:
            raise TypeError, 'expected dict'

    def __setitem__(self, key, value):
        if isinstance(value, dict) and not isinstance(value, dotdictify):
            value = dotdictify(value)
        super(dotdictify, self).__setitem__.(self, key, value)

    def __getitem__(self, key):
        found = self.get(key, dotdictify.marker)
        if found is dotdictify.marker:
            found = dotdictify()
            super(dotdictify, self).__setitem__(self, key, found)
        return found

    __setattr__ = __setitem__
    __getattr__ = __getitem__

life = {'bigBang' :
          {'stars':
               {'planets': {}
                }
           }
}

life = dotdictify(life)

print life.bigBang.stars.planets
life.bigBang.stars.planets.earth = { 'singleCellLife' : {} }
print life.bigBang.stars.planets

这篇关于Python:通过属性递归访问dict以及索引访问?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆