递归地从字典中设置对象属性

3

我的问题比较简单:如何递归地设置与字典中的键-值对匹配的对象属性?

例如,给定以下字典:

my_dict = {
    "number": 0,
    "thing": True,
    "foo": {
        "bar": {
            "thing": "string"
        }
    }
}

我想递归地将一个对象的键作为属性来创建它:

>>> my_obj = some_method(my_dict)
>>> my_obj.number
0
>>> my_obj.foo.bar
{"thing": "string"}
>>> my_obj.foo.bar.thing
"string" 

那么递归交换键/值? - Jab
1
字典元素使用索引而不是属性来访问。 - Barmar
my_obj["foo"]["bar"]["thing"] - Barmar
请参阅如何最佳实现嵌套字典? - martineau
@Jab 是的,https://dev59.com/dXE95IYBdhLWcg3wV8e_#32107024 很好用,我只是在想这个答案是否可以简化成一个函数。 - frissyn
另请参阅如何像属性一样访问字典键? - martineau
2个回答

3

https://github.com/Infinidat/munch

该库旨在为字典提供属性风格的访问。

例如:

>>> from bunch import bunchify
>>> d = {'a': 1, 'b': {'c': 2}, 'd': ["hi", {'foo': "bar"}]}
>>> x = bunchify(d)
>>> x.a
1
>>> x.b.c
2
>>> x.d[1].foo
'bar'

当然有这种事情的库,只是在谷歌搜索中找不到它,谢谢! - frissyn
你在讽刺吗? - user11375018
你想让我说我是在讽刺吗?不是吧?那么,不,我没有在讽刺。 - frissyn

3

使用内置库的另一种方法:

import json
from types import SimpleNamespace

my_dict = {
    "number": 0,
    "thing": True,
    "foo": {
        "bar": {
            "thing": "string"
        }
    }
}

dumped_data = json.dumps(my_dict)
result = json.loads(dumped_data, object_hook=lambda x: SimpleNamespace(**x))

result.number

>> 0

result.foo.bar.thing

>> string

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接