栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么PyYAML使用生成器构造对象?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么PyYAML使用生成器构造对象?

在YAML中,您可以具有锚点和别名。这样,您可以直接或间接地建立自我引用的结构。

如果YAML没有这种自我引用的可能性,则可以先构造所有子代,然后一次性创建父代结构。但是由于自身的引用,您可能还没有孩子来“填写”正在创建的结构。通过使用生成器的两步过程(我将其称为“两步”,因为它在方法结束之前只有一个屈服),您可以部分创建一个对象,并使用自引用填充它,因为对象存在(即定义了它在内存中的位置)。

好处不是速度,而是纯粹因为使自引用成为可能。

如果您只是从答案中简化示例,则会加载以下内容:

import sysimport ruamel.yaml as yamlclass Foo(object):    def __init__(self, s, l=None, d=None):        self.s = s        self.l1, self.l2 = l        self.d = ddef foo_constructor(loader, node):    instance = Foo.__new__(Foo)    yield instance    state = loader.construct_mapping(node, deep=True)    instance.__init__(**state)yaml.add_constructor(u'!Foo', foo_constructor)x = yaml.load('''&fooref!Foos: *foorefl: [1, 2]d: {try: this}''', Loader=yaml.Loader)yaml.dump(x, sys.stdout)

但是如果您更改

foo_constructor()
为:

def foo_constructor(loader, node):    instance = Foo.__new__(Foo)    state = loader.construct_mapping(node, deep=True)    instance.__init__(**state)    return instance

(删除收益,添加最终收益),您将获得

ConstructorError
带有消息的:

found unconstructable recursive node   in "<unipre string>", line 2, column 1:    &fooref

PyYAML应该给出类似的消息。检查该错误的回溯,您可以看到ruamel.yaml / PyYAML在源代码中尝试解析别名的位置。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/645219.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号