如何加载pyYAML文件并使用属性而不是使用字典表示法来访问它?

sor*_*rin 6 python yaml pyyaml

我有一个YAML配置,看起来像:

config:
 - id: foo
 - name: bar
content:
 - run: xxx
 - remove: yyy
Run Code Online (Sandbox Code Playgroud)

我正在使用Python YAML模块加载它,但我希望以更好的方式访问它,如:

stream = open(filename)
config = load(stream, Loader=Loader)
print(config['content'])
Run Code Online (Sandbox Code Playgroud)

我想要的是能够做到:print(config.content).

Chr*_*ris 8

您可以使用以下类在字典中使用对象表示法,如本答案中所述:

class DictAsMember(dict):
    def __getattr__(self, name):
        value = self[name]
        if isinstance(value, dict):
            value = DictAsMember(value)
        return value
Run Code Online (Sandbox Code Playgroud)

这个课程在行动:

>>> my_dict = DictAsMember(one=1, two=2)
>>> my_dict
{'two': 2, 'one': 1}
>>> my_dict.two
2
Run Code Online (Sandbox Code Playgroud)

编辑这与子词典递归地一起工作,例如:

>>> my_dict = DictAsMember(one=1, two=2, subdict=dict(three=3, four=4))
>>> my_dict.one
1
>>> my_dict.subdict
{'four': 4, 'three': 3}
>>> my_dict.subdict.four
4
Run Code Online (Sandbox Code Playgroud)

  • 为什么这个(最简单的答案)没有被投票一百万次?有数十个类似/重复的问题以如此复杂的方式回答这个问题! (2认同)