【问题标题】:Easy YAML emitting in Python在 Python 中轻松发出 YAML
【发布时间】:2012-06-12 14:18:19
【问题描述】:

我有这个数字代码,到目前为止,它有一堆 prints 在计算运行时提供几条信息。

为了让我更轻松地处理信息,我正在使用 YAML。对于 C++,存在以下语法

YAML::Emitter out;
out << YAML::BeginSeq;
out << "eggs";
out << "bread";
out << "milk";
out << YAML::EndSeq;

很好用。我现在想知道 Python 是否存在类似的东西。 我刚才遇到的一个粗略的等价物是 PyYAML,如果我没记错的话,上面的等价物看起来像

print yaml.emit([yaml.StreamStartEvent(),
                 yaml.DocumentStartEvent(),
                 yaml.SequenceStartEvent(anchor=None, tag=None, implicit=True),
                 yaml.ScalarEvent(anchor=None, tag=None, implicit=(True, False), value=u'eggs'),
                 yaml.ScalarEvent(anchor=None, tag=None, implicit=(True, False), value=u'bread'),
                 yaml.ScalarEvent(anchor=None, tag=None, implicit=(True, False), value=u'milk'),
                 yaml.SequenceEndEvent()
               ])

哇,这太冗长了。你知道不那么冗长的语法/Python YAML 包吗? 当然,总是有yaml.dump(),但重要的是要立即写出数据。

【问题讨论】:

  • 这很危险地接近于“向我推荐一些 X”的问题,所以不适合。我建议专门要求一个不那么冗长的 Python YAML 库(或一种使 PyYAML 不那么冗长的方法)。
  • 是的,这是一个很好的提示;重新制定。

标签: python yaml


【解决方案1】:

PyYAML 尝试确保其输出始终格式正确,因此您不能发出部分文档。

解决方案是始终发出完整的文档!

import yaml
print yaml.dump(["eggs", "bread", "milk", "squick"], explicit_start=True)
print yaml.dump(dict(a=1, b=2, c=3), explicit_start=True)

这将输出一个包含 2 个文档的流,您可以使用 yaml.load_all 加载它们。

【讨论】:

  • 什么是“部分文档”?据我所知,YAML 没有任何结束标签(可能除了用于显式列表和字典的“]”和“}”),无论如何,上面这段冗长的 yaml.emit 代码也确实产生了一些有意义的东西。好吧,尽管在这里不可能嵌套东西,但转储完整的字典和列表是一种选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-21
  • 1970-01-01
  • 2013-10-17
  • 2019-11-29
相关资源
最近更新 更多