作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在网上搜索自定义构造函数的用法时,我看到如下内容:
def some_constructor(loader, node):
value = loader.construct_mapping(node, deep=True)
return SomeClass(value)
deep=True
有什么作用?我在
pyyaml documentation 中没有看到它。
&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
时才会执行。
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
以供稍后解析。
self.state_generators
中循环遍历潜在的递归对象,直到没有生成器为止(这个过程可能需要多次通过)。
关于python-2.7 - deep=True 在 pyyaml.Loader.construct_mapping 中有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43812020/
我正在尝试在 python 中创建一个创建自定义 python 对象的 yaml 序列。该对象需要使用在 __init__ 之后解构的字典和列表来构造。但是,construct_mapping 函数似
在网上搜索自定义构造函数的用法时,我看到如下内容: def some_constructor(loader, node): value = loader.construct_mapping(n
我是一名优秀的程序员,十分优秀!