<p>基于mujjija的解决方案,这就是我想到的。完整代码如下</p>
<pre><code>from types import SimpleNamespace
def parse(data):
if type(data) is list:
return list(map(parse, data))
elif type(data) is dict:
sns = SimpleNamespace()
for key, value in data.items():
setattr(sns, key, parse(value))
return sns
else:
return data
info = {
'country': 'Australia',
'number': 1,
'slangs': [
'no worries mate',
'winner winner chicken dinner',
{
'no_slangs': [123, {'definately_not': 'hello'}]
}
],
'tradie': {
'name': 'Rizza',
'occupation': 'sparkie'
}
}
d = parse(info)
assert d.country == 'Australia'
assert d.number == 1
assert d.slangs[0] == 'no worries mate'
assert d.slangs[1] == 'winner winner chicken dinner'
assert d.slangs[2].no_slangs[0] == 123
assert d.slangs[2].no_slangs[1].definately_not == 'hello'
assert d.tradie.name == 'Rizza'
assert d.tradie.occupation == 'sparkie'
</code></pre>
<p>如果我没有弄错的话,Python不支持尾部调用优化。因此,在Python中使用深层递归函数时请小心。对于小的例子,它应该是好的</p>
<p><strong>更新</strong></p>
<p>另一个版本<code>object_hook</code>有筑巢的魔力。我更喜欢这个版本,因为我可以直接将它们提供给<code>jinja2</code>模板引擎</p>
<pre><code>import json
class _DotDict(dict):
__getattr__ = dict.__getitem__
__setattr__ = dict.__setitem__
__delattr__ = dict.__delitem__
def dot(data=None):
if data is []:
return []
return json.loads(json.dumps(data), object_hook=_DotDict) if data else _DotDict()
</code></pre>