Причина добавления маркера конца документа (...
) заключается в том, что число сбрасывается в виде скаляра plain на корневом уровне документа.То же самое происходит, если вы выгружаете строку (при условии, что строка может быть выгружена без кавычек без неправильного толкования, то есть строка, состоящая только из цифр, должна быть заключена в кавычки, чтобы не рассматриваться как целое число).
Без документа-end-marker, при загрузке из потока, анализатор не будет знать, завершен ли документ, или поток только ожидает заполнения.Document-end-marker устраняет эту неоднозначность, так что это сделано намеренно, но, например, при разборе файла (вместо общего потока) это можно и будет выполнять путем проверки конца файла.
Есть несколько способов обойти это, один из них - преобразовать вывод:
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)
, что дает:
abc
Выше также должно работать с 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)
, что также дает:
abc