在没有循环的方法中产生

如何解决在没有循环的方法中产生

我正在使用源代码研​​究 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?