安裝:pip install munch
用法參考:https://github.com/Infinidat/munch
Munch is a dictionary that supports attribute-style access, a la JavaScript.意思是支援"a.b"的寫法擷取屬性值
In [4]: from munch import Munch
In [5]: b=Munch()
In [6]: b.hello='world'
In [7]: b
Out[7]: Munch({'hello': 'world'})
In [8]: b.hello
Out[8]: 'world'
In [9]: b.hello+="!"
In [10]: b
Out[10]: Munch({'hello': 'world!'})
In [11]: b.fool=Munch(lol=True)
In [12]: b
Out[12]: Munch({'hello': 'world!', 'fool': Munch({'lol': True})})
In [13]: b.fool
Out[13]: Munch({'lol': True})
In [14]: b.fool.lol
Out[14]: True
In [16]: b['fool']
Out[16]: Munch({'lol': True})
In [17]: b['fool']['lol']
Out[17]: True
In [18]: b['fool'].lol
Out[18]: True
自然也是支援字典的各種用法:
In [19]: b.keys()
Out[19]: dict_keys(['hello', 'fool'])
In [20]: b.update({'ponies':'are prettty!'},hello=42)
In [21]: b
Out[21]: Munch({'hello': 42, 'ponies': 'are prettty!', 'fool': Munch({'lol': True})})
In [22]: print(repr(b))
Munch({'hello': 42, 'ponies': 'are prettty!', 'fool': Munch({'lol': True})})
In [23]: [ (k,b[k]) for k in b ]
Out[23]: [('hello', 42), ('ponies', 'are prettty!'), ('fool', Munch({'lol': True}))]
In [24]: "The {knights} who say {ni}!".format(**Munch(knights='lolcats', ni='can haz'))
Out[24]: 'The lolcats who say can haz!'
In [25]: "The {knights} who say {ni}!".format(**{'knights':'test','ni':'wo'})
Out[25]: 'The test who say wo!'
使用json和yaml實作序列化:
In [26]: b = Munch(foo=Munch(lol=True), hello=42, ponies='are pretty!')
In [27]: import json
In [28]: json.dumps(b)
Out[28]: '{"hello": 42, "ponies": "are pretty!", "foo": {"lol": true}}'
In [29]: import yaml
In [30]: yaml.dump(b)
Out[30]: '!munch.Munch\nfoo: !munch.Munch {lol: true}\nhello: 42\nponies: are pretty!\n'
In [31]: yaml.safe_dump(b)
Out[31]: 'foo: {lol: true}\nhello: 42\nponies: are pretty!\n'
Default Values
DefaultMunch instances return a specific default value when an attribute is missing from the collection. Like collections.defaultdict, the first argument is the value to use for missing keys:
>>> undefined = object()
>>> b = DefaultMunch(undefined, {'hello': 'world!'})
>>> b.hello
'world!'
>>> b.foo is undefined
True
DefaultMunch.fromDict() also takes the default argument:
>>> undefined = object()
>>> b = DefaultMunch.fromDict({'recursively': {'nested': 'value'}}, undefined)
>>> b.recursively.nested == 'value'
True
>>> b.recursively.foo is undefined
True
Or you can use DefaultFactoryMunch to specify a factory for generating missing attributes. The first argument is the factory:
>>> b = DefaultFactoryMunch(list, {'hello': 'world!'})
>>> b.hello
'world!'
>>> b.foo
[]
>>> b.bar.append('hello')
>>> b.bar
['hello']