如何解决在没有循环的方法中产生
我正在使用源代码研究 ruamel.yaml API 并发现 this strange pattern in code:
def construct_yaml_map(self,node):
# type: (Any) -> Any
data = CommentedMap()
data._yaml_set_line_col(node.start_mark.line,node.start_mark.column)
yield data
self.construct_mapping(node,data,deep=True)
self.set_collection_style(data,node)
然后就需要编写这样的代码 (inspired by the code in another place)
generator = yaml.constructor.construct_yaml_map(mapping_node)
# method does not run,only returns generator
data = next(generator)
# method executes until yield data (empty CommentedMap)
for _dummy in generator:
# on first iteration method continues until end
# no second iteration
pass
# or alternative expression
#try:
# next(generator)
#except stopiteration:
# pass
# Now data is filled
在没有任何循环的方法中间使用这个 yield
有什么用?
解决方法
Python 允许您创建递归数据结构,并且与 许多其他流格式,YAML 允许您转储这些
import sys
import ruamel.yaml
data = dict(a=1)
data['b'] = data
yaml = ruamel.yaml.YAML()
yaml.dump(data,sys.stdout)
给出:
&id001
a: 1
b: *id001
这里的 &id001
是 YAML 语言中的一个锚点,它被 *id001
引用,称为别名。
我不知道有什么方法可以在不使用多个语句的情况下在 Python 中创建 data
。你需要
对象(或其 id
)能够将其添加到自身。 YAML 加载器有同样的问题:
当它解析和构造一个组合(一个映射或一个序列)时,它收集所有的
孩子(键/值对和元素),然后构造组合。所以当复合
在 YAML 中(通过别名)引用自身,锚的查找需要提供一个真实的,尽管
不完整的、构造的 Python 对象(字典、列表,如果是标记对象,则可能是一个实例
某个班级的)。
这就是为什么使用创建复合材料的两步过程:您创建一个空对象
您退还,以便在必要时可以在锚点/别名表中进行参考,
然后在代码的帖子 yield
部分填写。
合成不需要在其中之一中具有别名
他们的价值观或元素,但如果他们没有锚,他们可以
一步构建。但这会导致
不同的构造函数和调用 construct_yaml_map()
的代码
了解这些不同构造的对象。问题
移动,但不会消失,就像你可以创建递归
Python 不同,但仍需要多个语句。
顺便说一句,这不是 ruamel.yaml
特定的。这段代码是,AFAIK 仍然是,在 PyYAML 代码中
ruamel.yaml
的来源。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。