即使 yaml.explicit_end=False,Yaml 结束(“...”)也始终会被转储

jor*_*rel 7 python yaml ruamel.yaml

我想知道这是否真的是错误或意图,但无论如何。

\n\n

为什么转储单个值总是包含显式 YAML 结尾?

\n\n
import sys\nfrom ruamel.yaml import YAML\nyaml=YAML()\nyaml.explicit_end=False\nyaml.dump(1, sys.stdout)\n
Run Code Online (Sandbox Code Playgroud)\n\n

生产

\n\n
1\n...\n
Run Code Online (Sandbox Code Playgroud)\n\n

可以\xe2\x80\xa6以某种方式轻松跳过吗?

\n

Ant*_*hon 5

添加文档结束标记 ( ) 的原因是该数字在文档的根级别...转储为普通标量。如果您转储字符串,也会发生同样的情况(假设可以在不带引号的情况下转储字符串而不会被误解,即仅由数字组成的字符串必须加引号,以免被视为整数)。

如果没有文档结束标记,从流加载时,解析器将不知道文档是否完整,或者流是否正在等待填充。文档结束标记消除了这种歧义,因此这是有意为之,但是例如在解析文件(而不是通用流)时,也可以并且将会通过检查文件结尾来完成。

有几种方法可以解决这个问题,其中一种是转换输出:

import sys
import ruamel.yaml

def strip_document_end_marker(s):
   if s.endswith('...\n'):
       return s[:-4]

yaml = ruamel.yaml.YAML()
yaml.dump("abc", sys.stdout, transform=strip_document_end_marker)
Run Code Online (Sandbox Code Playgroud)

这使:

abc
Run Code Online (Sandbox Code Playgroud)

上面的内容也适用dump_all于多个文档(最后一个是根级纯标量)。

open_ended实现此目的的另一种方法是在写入纯值后重置属性:

import sys
import ruamel.yaml

yaml = ruamel.yaml.YAML()

def wp(self, *args, **kw):
    self.write_plain_org(*args, **kw)
    self.open_ended = False

yaml.Emitter.write_plain_org = yaml.Emitter.write_plain
yaml.Emitter.write_plain = wp
yaml.dump("abc", sys.stdout)
Run Code Online (Sandbox Code Playgroud)

这也给出:

abc
Run Code Online (Sandbox Code Playgroud)