如何解析/读取YAML文件到Python对象?
例如,这个YAML:
Person:
name: XYZ
Run Code Online (Sandbox Code Playgroud)
对于这个Python类:
class Person(yaml.YAMLObject):
yaml_tag = 'Person'
def __init__(self, name):
self.name = name
Run Code Online (Sandbox Code Playgroud)
我顺便使用PyYAML.
我一直在阅读PyYAML源代码,试图了解如何定义一个我可以添加的正确的构造函数add_constructor.我对该代码现在的工作方式有了很好的理解,但我仍然不明白为什么默认的YAML构造函数SafeConstructor是生成器.例如,该方法construct_yaml_map的SafeConstructor:
def construct_yaml_map(self, node):
data = {}
yield data
value = self.construct_mapping(node)
data.update(value)
Run Code Online (Sandbox Code Playgroud)
我理解如何使用生成器BaseConstructor.construct_object如下所示来存根一个对象,并且仅使用来自节点的数据填充它,如果deep=False传递给construct_mapping:
if isinstance(data, types.GeneratorType):
generator = data
data = generator.next()
if self.deep_construct:
for dummy in generator:
pass
else:
self.state_generators.append(generator)
Run Code Online (Sandbox Code Playgroud)
我理解BaseConstructor.construct_document在deep=Falsefor 的情况下如何生成数据construct_mapping.
def construct_document(self, node):
data = self.construct_object(node)
while self.state_generators:
state_generators = self.state_generators
self.state_generators = []
for generator in state_generators:
for dummy in generator:
pass
Run Code Online (Sandbox Code Playgroud)
我不明白的是通过遍历生成器来截断数据对象和解决对象的好处construct_document …
在网上搜索自定义构造函数的用法时,我看到如下内容:
def some_constructor(loader, node):
value = loader.construct_mapping(node, deep=True)
return SomeClass(value)
Run Code Online (Sandbox Code Playgroud)
其作用是什么deep=True?我在pyyaml 文档中没有看到它。
看来我需要它;我有一个由 pyyaml 表示器生成的 yaml 文件,它包括节点锚点和别名(如&id003和*id003);如果没有,deep=True我会得到包含锚点/别名的那些对象的浅地图。