我已经为折叠字符串、文字字符串添加了表示符,如 Any yaml libraries in Python that support dumping of long strings as block literals or folded blocks? 中所述.我还添加了代表以在转储的 yaml 内容中以 block 样式打印列表。
但问题在于,当字符串为空时,即“”或列表为空时,它们会以非 block 样式出现在转储的 YAML 内容中。
如何强制 pyyaml 转储器输出带有“>”或“|”的“”空字符串在生成的 YAML 内容中以 block 样式使用 flow_style=False 样式和空列表?
最佳答案
经过一些研究,我能够使用 Pyyaml 将空字符串转储为 YAML 文件中的 block 文字('|>' 中的样式)。我的工作部分基于 Any yaml libraries in Python that support dumping of long strings as block literals or folded blocks? .
import yaml
from yaml.emitter import Emitter, ScalarAnalysis
class MyEmitter(Emitter):
def analyze_scalar(self, scalar):
# Empty scalar is a special case.
# By default, pyyaml sets allow_block=False
# I override this to set allow_block=True
if not scalar:
return ScalarAnalysis(scalar=scalar, empty=True, multiline=False,
allow_flow_plain=False, allow_block_plain=True,
allow_single_quoted=True, allow_double_quoted=True,
allow_block=True)
return super(MyEmitter, self).analyze_scalar(scalar)
# And I subclass MyDumper from MyEmitter and yaml.Dumper
class MyDumper(yaml.Dumper, MyEmitter):
pass
class folded_unicode(unicode): pass
class literal_unicode(unicode): pass
def folded_unicode_representer(dumper, data):
return dumper.represent_scalar(u'tag:yaml.org,2002:str', data, style='>')
def literal_unicode_representer(dumper, data):
return dumper.represent_scalar(u'tag:yaml.org,2002:str', data, style='|')
yaml.add_representer(folded_unicode, folded_unicode_representer)
yaml.add_representer(literal_unicode, literal_unicode_representer)
# I test it now
d = {'foo': {'folded': folded_unicode(''), 'literal': literal_unicode('')}}
print yaml.dump(d, Dumper=MyDumper)
输出:
foo:
folded: >
literal: |
但是,我找不到以 block 样式转储空列表的方法。为此,我试图弄乱 yaml/emitter.py 并意识到我需要一个非空列表以 block 样式转储它。
不管怎么说,这次的努力没有白费,还挺刺激的:) 我希望有人会觉得这很有用,或者可能有一些东西要分享。
关于string - Pyyaml中,如何用 block 样式表示空字符串和列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10882401/