嵌套字典的类对象属性访问

Tim*_*m B 3 python dictionary nested bunch

我正在使用一个返回嵌套字典的包。当其他所有内容都使用对象语法时,使用字典语法访问我的类方法中的此返回对象会感到很尴尬。搜索使我进入了大包/新捆绑包,这似乎实现了我的追求。我也看到过建议使用namedtuples的方法,但是这些方法不容易支持嵌套属性,大多数解决方案都依赖于使用namedtuple中的字典进行嵌套。

什么是实现这一目标的更自然的方式?

data = {'a': 'aval', 'b': {'b1':{'b2a':{'b3a':'b3aval','b3b':'b3bval'},'b2b':'b2bval'}} }

print(data['b']['b1']['b2a']['b3b'])  # dictionary access
# print(data.b.b1.b2a.b3b)  # desired access

import neobunch
data1 = neobunch.bunchify(data)
print(data1.b.b1.b2a.b3b)
Run Code Online (Sandbox Code Playgroud)

mar*_*eau 5

以下课程可让您做自己想做的事情:

class AttrDict(dict):
    """ Dictionary subclass whose entries can be accessed by attributes
        (as well as normally).
    """
    def __init__(self, *args, **kwargs):
        super(AttrDict, self).__init__(*args, **kwargs)
        self.__dict__ = self

    @staticmethod
    def from_nested_dict(data):
        """ Construct nested AttrDicts from nested dictionaries. """
        if not isinstance(data, dict):
            return data
        else:
            return AttrDict({key: AttrDict.from_nested_dict(data[key])
                                for key in data})

data = {
    "a": "aval",
    "b": {
        "b1": {
            "b2b": "b2bval",
            "b2a": {
                "b3a": "b3aval",
                "b3b": "b3bval"
            }
        }
    }
}

data1 = AttrDict.from_nested_dict(data)
print(data1.b.b1.b2a.b3b)  # -> b3bval
Run Code Online (Sandbox Code Playgroud)

  • @BartKleijngeld:当然......这是一个相当奇怪的野兽。`AttrDict` 是一个字典子类,它使用 _itself_ 作为类'__dict__`。后者是通常存储实例属性的位置,通常使用“.”(点)表示法引用,例如“obj.attr”,但由于它是字典,您仍然可以使用常规“[]”表示法访问它们,就像`obj['attr']`。这是从 Javascript 借来的想法。[ActiveState](https://code.activestate.com/recipes/576972-attrdict) 上有一个不同的配方,我也在其他几个地方看到过。 (2认同)