gpt4 book ai didi

python-2.7 - deep=True 在 pyyaml.Loader.construct_mapping 中有什么作用?

转载 作者:行者123 更新时间:2023-12-03 23:18:25 24 4
gpt4 key购买 nike

在网上搜索自定义构造函数的用法时,我看到如下内容:

def some_constructor(loader, node):
value = loader.construct_mapping(node, deep=True)
return SomeClass(value)
deep=True 有什么作用?我在 pyyaml documentation 中没有看到它。

看起来我需要它;我有一个由 py​​yaml 代表生成的 yaml 文件,它包含节点 anchor 和别名(如 &id003*id003 );如果没有 deep=True,我会为那些包含 anchor /别名的对象返回一个浅映射。

最佳答案

您在文档中没有看到 deep=True 是因为您通常不需要将它用作 PyYAML 包的最终用户。

如果您跟踪 constructor.py 中使用 deep= 的方法的使用,您会看到 construct_mapping() 类中的 construct_sequence()BaseConstructor() ,这两个都调用 BaseConstructor.construct_object()
该方法中的相关代码是:

    if tag_suffix is None:
data = constructor(self, node)
else:
data = constructor(self, tag_suffix, node)
if isinstance(data, types.GeneratorType):
generator = data
data = next(generator)
if self.deep_construct:
for dummy in generator:
pass
else:
self.state_generators.append(generator)

特别是其中的 for 循环,只有在传入 deep=True 时才会执行。

Rougly 说,如果来自构造函数的数据是生成器,那么它会遍历该数据(在 for 循环中),直到生成器耗尽。通过这种机制,这些构造函数可以包含一个 yield 来创建一个基础对象,其中的细节可以在 yield 之后填写。因为它们在这样的构造函数中只是一个 yield,例如对于映射(构造为 Python dict s):
def construct_yaml_map(self, node):
data = {}
yield data
value = self.construct_mapping(node)
data.update(value)

我将此称为两步过程(一步到 yield,然后是方法末尾。

在这样的两步构造函数中,要生成的 data 构造为空,生成然后填充。之所以如此,是因为您已经注意到了:递归。如果在下面的某处存在对 data 的自引用,则无法在其所有子代都被构造后构造 data,因为它必须等待自身被构造。
deep 参数间接控制潜在生成器的对象是递归构建还是附加到列表 self.state_generators 以供稍后解析。

构建一个 YAML 文档然后归结为构建顶级对象并在 self.state_generators 中循环遍历潜在的递归对象,直到没有生成器为止(这个过程可能需要多次通过)。

关于python-2.7 - deep=True 在 pyyaml.Loader.construct_mapping 中有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43812020/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com