我使用了一个返回嵌套字典的包。在我的类方法中使用字典语法访问这个返回对象感觉很尴尬,而其他所有内容都是对象语法。搜索把我带到了bunch / neobunch包,它似乎实现了我所追求的。我也看到namedtuple的建议,但这些不容易支持嵌套属性,大多数解决方案依赖于使用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)
8条答案
按热度按时间ecfsfe2w1#
下面的类可以让你做你想做的事情(适用于Python 2和3):
iqxoj9l92#
基于@martineau的优秀答案,您可以使AttrDict类在嵌套字典上工作,而无需显式调用from_nested_dict()函数:
68de4m5k3#
json.loads
有一个名为object_hook
的有趣参数,如果所有字典值都是JSON可序列化的,则可以使用该参数,即,如果Guido正在监听,我认为
SimpleNamespace
应该接受一个recursive
参数,这样你就可以直接执行data1 = SimpleNamespace(recursive=True, **data)
了。gc0ot86w4#
尝试Dotsi或EasyDict。它们都支持嵌套字典的点表示法。
除了dicts-within-dicts之外,Dotsi还支持dicts-within-lists-within-dicts。
注:我是Dotsi的作者。
smtd7mpg5#
如何使用
__setattr__
方法?5jdjgkvh6#
一个简单的类,构建在基本对象上,可以使用:
我借用了
argparse.Namespace
的定义,并进行了调整以允许嵌套。它将被用作
它也可以用
**kwargs
(沿着*args
)定义。__repr__
的定义可能也不错。与其他简单对象一样,可以添加属性,例如
f.c = f
(递归定义)。vars(f)
返回一个字典,尽管它不做任何递归转换)。brc7rcf07#
致谢:灵感来自@martineau的top answer
还添加了对
list/tuple
的支持n3ipq98p8#
去年我也遇到了同样的问题。最后,我写了CHANfiG。
这里是核心函数(注意
DefaultDict
的工作方式类似于collections.defaultdict
),属性式访问的一些实现细节可能在FlatDict
中,它是dict
的子类。__getattr__
和__getitem__
都在内部调用get
,但引发不同的Exception
,set
和delete
也是如此。