string - Pyyaml中,如何用 block 样式表示空字符串和列表?

标签 string yaml dump pyyaml empty-list

我已经为折叠字符串、文字字符串添加了表示符,如 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/

相关文章:

java - 如何提取字符串的一部分?

java - 从字符串中删除所有出现的 char

symfony2 : how to include line breaks/newlines in translations?

postgresql - 当我尝试恢复 PostgreSQL 转储时出现很多 "invalid command\N"

java - 打印特定字符

javascript - 正则表达式删除路径名的第一部分

yaml - windows 7下编译libyaml时编译报错

syntax-error - 如何修复 YAML 语法错误 : did not find expected '-' indicator while parsing a block?

python - 如何在 python 中使用 json 将包含用户定义类的字典转储为值?

c# - 为 .NET 进程生成带有符号的转储文件