使用点表示法从嵌套的 python 字典中检索值
Retrieving values from nested python dicts with dot notation
我目前在我的一个项目中使用 ConfigObj 来获得基于结构化文本的配置文件,它非常简洁。
it returns 的数据结构是一个普通的字典类型,在我的例子中,它可以包含许多其他字典作为值,它们本身可以包含字典,等等。
我正在寻找用 class 包装主字典的最 pythonic 方法,以便实现 getattr 之类的东西,用点符号递归地检索项目。像这样:
class MyDict(dict):
def __init__(self, **kwargs):
self.d = dict(kwargs)
def __getattr__(self, key, default=None):
try:
return self.d[key]
except AttributeError:
print "no-oh!"
return default
不幸的是,这只适用于第一层。如果我调用的键的值也是一个 L2 dict,并且递归到内层,我实际上希望这是递归的。
类似这样的调用:
foo = MyDict(super_very_complex_nested_dict)
x = foo.a1
y = foo.a2.b1 #a2 is a dict value
z = foo.a2.b2.c1 #a2 and b2 are dict values
这样做的明智方法是什么?
编辑:我的问题与建议的重复问题略有不同。我知道如何将 getattr 用于普通命令。我想知道如何将它用于嵌套的字典。我不认为这是一个天真的问题。
好吧,我在建议的线程中做了更多,我实际上找到了一个很好的解决方案,那就是使用这个包:
https://pypi.python.org/pypi/attrdict
这正是我想要的,递归。
这解决了我的问题。评估其他解决方案会很好 :)
我目前在我的一个项目中使用 ConfigObj 来获得基于结构化文本的配置文件,它非常简洁。 it returns 的数据结构是一个普通的字典类型,在我的例子中,它可以包含许多其他字典作为值,它们本身可以包含字典,等等。 我正在寻找用 class 包装主字典的最 pythonic 方法,以便实现 getattr 之类的东西,用点符号递归地检索项目。像这样:
class MyDict(dict):
def __init__(self, **kwargs):
self.d = dict(kwargs)
def __getattr__(self, key, default=None):
try:
return self.d[key]
except AttributeError:
print "no-oh!"
return default
不幸的是,这只适用于第一层。如果我调用的键的值也是一个 L2 dict,并且递归到内层,我实际上希望这是递归的。
类似这样的调用:
foo = MyDict(super_very_complex_nested_dict)
x = foo.a1
y = foo.a2.b1 #a2 is a dict value
z = foo.a2.b2.c1 #a2 and b2 are dict values
这样做的明智方法是什么?
编辑:我的问题与建议的重复问题略有不同。我知道如何将 getattr 用于普通命令。我想知道如何将它用于嵌套的字典。我不认为这是一个天真的问题。
好吧,我在建议的线程中做了更多,我实际上找到了一个很好的解决方案,那就是使用这个包:
https://pypi.python.org/pypi/attrdict
这正是我想要的,递归。 这解决了我的问题。评估其他解决方案会很好 :)